<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    package org.apache.archiva.admin.repository.managed;<a name="line.1"></a>
<FONT color="green">002</FONT>    /*<a name="line.2"></a>
<FONT color="green">003</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
<FONT color="green">004</FONT>     * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
<FONT color="green">005</FONT>     * distributed with this work for additional information<a name="line.5"></a>
<FONT color="green">006</FONT>     * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
<FONT color="green">007</FONT>     * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
<FONT color="green">008</FONT>     * "License"); you may not use this file except in compliance<a name="line.8"></a>
<FONT color="green">009</FONT>     * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
<FONT color="green">010</FONT>     *<a name="line.10"></a>
<FONT color="green">011</FONT>     *   http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
<FONT color="green">012</FONT>     *<a name="line.12"></a>
<FONT color="green">013</FONT>     * Unless required by applicable law or agreed to in writing,<a name="line.13"></a>
<FONT color="green">014</FONT>     * software distributed under the License is distributed on an<a name="line.14"></a>
<FONT color="green">015</FONT>     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.15"></a>
<FONT color="green">016</FONT>     * KIND, either express or implied.  See the License for the<a name="line.16"></a>
<FONT color="green">017</FONT>     * specific language governing permissions and limitations<a name="line.17"></a>
<FONT color="green">018</FONT>     * under the License.<a name="line.18"></a>
<FONT color="green">019</FONT>     */<a name="line.19"></a>
<FONT color="green">020</FONT>    <a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.archiva.admin.model.AuditInformation;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.archiva.admin.model.RepositoryAdminException;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.archiva.admin.model.beans.ManagedRepository;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.archiva.audit.AuditEvent;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.archiva.configuration.Configuration;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.archiva.configuration.ManagedRepositoryConfiguration;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.archiva.configuration.ProxyConnectorConfiguration;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.archiva.configuration.RepositoryGroupConfiguration;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.apache.archiva.metadata.repository.MetadataRepository;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.apache.archiva.metadata.repository.MetadataRepositoryException;<a name="line.35"></a>
<FONT color="green">036</FONT>    import org.apache.archiva.metadata.repository.RepositorySession;<a name="line.36"></a>
<FONT color="green">037</FONT>    import org.apache.archiva.metadata.repository.RepositorySessionFactory;<a name="line.37"></a>
<FONT color="green">038</FONT>    import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;<a name="line.38"></a>
<FONT color="green">039</FONT>    import org.apache.archiva.redback.components.taskqueue.TaskQueueException;<a name="line.39"></a>
<FONT color="green">040</FONT>    import org.apache.archiva.redback.role.RoleManager;<a name="line.40"></a>
<FONT color="green">041</FONT>    import org.apache.archiva.redback.role.RoleManagerException;<a name="line.41"></a>
<FONT color="green">042</FONT>    import org.apache.archiva.scheduler.repository.model.RepositoryArchivaTaskScheduler;<a name="line.42"></a>
<FONT color="green">043</FONT>    import org.apache.archiva.scheduler.repository.model.RepositoryTask;<a name="line.43"></a>
<FONT color="green">044</FONT>    import org.apache.archiva.security.common.ArchivaRoleConstants;<a name="line.44"></a>
<FONT color="green">045</FONT>    import org.apache.commons.io.FileUtils;<a name="line.45"></a>
<FONT color="green">046</FONT>    import org.apache.commons.lang.StringUtils;<a name="line.46"></a>
<FONT color="green">047</FONT>    import org.apache.maven.index.NexusIndexer;<a name="line.47"></a>
<FONT color="green">048</FONT>    import org.apache.maven.index.context.IndexCreator;<a name="line.48"></a>
<FONT color="green">049</FONT>    import org.apache.maven.index.context.IndexingContext;<a name="line.49"></a>
<FONT color="green">050</FONT>    import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;<a name="line.50"></a>
<FONT color="green">051</FONT>    import org.slf4j.Logger;<a name="line.51"></a>
<FONT color="green">052</FONT>    import org.slf4j.LoggerFactory;<a name="line.52"></a>
<FONT color="green">053</FONT>    import org.springframework.stereotype.Service;<a name="line.53"></a>
<FONT color="green">054</FONT>    <a name="line.54"></a>
<FONT color="green">055</FONT>    import javax.annotation.PostConstruct;<a name="line.55"></a>
<FONT color="green">056</FONT>    import javax.annotation.PreDestroy;<a name="line.56"></a>
<FONT color="green">057</FONT>    import javax.inject.Inject;<a name="line.57"></a>
<FONT color="green">058</FONT>    import javax.inject.Named;<a name="line.58"></a>
<FONT color="green">059</FONT>    import java.io.File;<a name="line.59"></a>
<FONT color="green">060</FONT>    import java.io.IOException;<a name="line.60"></a>
<FONT color="green">061</FONT>    import java.net.MalformedURLException;<a name="line.61"></a>
<FONT color="green">062</FONT>    import java.util.ArrayList;<a name="line.62"></a>
<FONT color="green">063</FONT>    import java.util.Collections;<a name="line.63"></a>
<FONT color="green">064</FONT>    import java.util.HashMap;<a name="line.64"></a>
<FONT color="green">065</FONT>    import java.util.List;<a name="line.65"></a>
<FONT color="green">066</FONT>    import java.util.Map;<a name="line.66"></a>
<FONT color="green">067</FONT>    <a name="line.67"></a>
<FONT color="green">068</FONT>    /**<a name="line.68"></a>
<FONT color="green">069</FONT>     * FIXME review the staging mechanism to have a per user session one<a name="line.69"></a>
<FONT color="green">070</FONT>     *<a name="line.70"></a>
<FONT color="green">071</FONT>     * @author Olivier Lamy<a name="line.71"></a>
<FONT color="green">072</FONT>     */<a name="line.72"></a>
<FONT color="green">073</FONT>    @Service( "managedRepositoryAdmin#default" )<a name="line.73"></a>
<FONT color="green">074</FONT>    public class DefaultManagedRepositoryAdmin<a name="line.74"></a>
<FONT color="green">075</FONT>        extends AbstractRepositoryAdmin<a name="line.75"></a>
<FONT color="green">076</FONT>        implements ManagedRepositoryAdmin<a name="line.76"></a>
<FONT color="green">077</FONT>    {<a name="line.77"></a>
<FONT color="green">078</FONT>    <a name="line.78"></a>
<FONT color="green">079</FONT>        private Logger log = LoggerFactory.getLogger( getClass() );<a name="line.79"></a>
<FONT color="green">080</FONT>    <a name="line.80"></a>
<FONT color="green">081</FONT>        public static final String STAGE_REPO_ID_END = "-stage";<a name="line.81"></a>
<FONT color="green">082</FONT>    <a name="line.82"></a>
<FONT color="green">083</FONT>        @Inject<a name="line.83"></a>
<FONT color="green">084</FONT>        @Named( value = "archivaTaskScheduler#repository" )<a name="line.84"></a>
<FONT color="green">085</FONT>        private RepositoryArchivaTaskScheduler repositoryTaskScheduler;<a name="line.85"></a>
<FONT color="green">086</FONT>    <a name="line.86"></a>
<FONT color="green">087</FONT>        /**<a name="line.87"></a>
<FONT color="green">088</FONT>         * FIXME: this could be multiple implementations and needs to be configured.<a name="line.88"></a>
<FONT color="green">089</FONT>         */<a name="line.89"></a>
<FONT color="green">090</FONT>        @Inject<a name="line.90"></a>
<FONT color="green">091</FONT>        private RepositorySessionFactory repositorySessionFactory;<a name="line.91"></a>
<FONT color="green">092</FONT>    <a name="line.92"></a>
<FONT color="green">093</FONT>        @Inject<a name="line.93"></a>
<FONT color="green">094</FONT>        private RepositoryStatisticsManager repositoryStatisticsManager;<a name="line.94"></a>
<FONT color="green">095</FONT>    <a name="line.95"></a>
<FONT color="green">096</FONT>        @Inject<a name="line.96"></a>
<FONT color="green">097</FONT>        private PlexusSisuBridge plexusSisuBridge;<a name="line.97"></a>
<FONT color="green">098</FONT>    <a name="line.98"></a>
<FONT color="green">099</FONT>        @Inject<a name="line.99"></a>
<FONT color="green">100</FONT>        private MavenIndexerUtils mavenIndexerUtils;<a name="line.100"></a>
<FONT color="green">101</FONT>    <a name="line.101"></a>
<FONT color="green">102</FONT>        @Inject<a name="line.102"></a>
<FONT color="green">103</FONT>        protected RoleManager roleManager;<a name="line.103"></a>
<FONT color="green">104</FONT>    <a name="line.104"></a>
<FONT color="green">105</FONT>        // fields<a name="line.105"></a>
<FONT color="green">106</FONT>        List&lt;? extends IndexCreator&gt; indexCreators;<a name="line.106"></a>
<FONT color="green">107</FONT>    <a name="line.107"></a>
<FONT color="green">108</FONT>        NexusIndexer indexer;<a name="line.108"></a>
<FONT color="green">109</FONT>    <a name="line.109"></a>
<FONT color="green">110</FONT>        @PostConstruct<a name="line.110"></a>
<FONT color="green">111</FONT>        public void initialize()<a name="line.111"></a>
<FONT color="green">112</FONT>            throws RepositoryAdminException, RoleManagerException<a name="line.112"></a>
<FONT color="green">113</FONT>        {<a name="line.113"></a>
<FONT color="green">114</FONT>            try<a name="line.114"></a>
<FONT color="green">115</FONT>            {<a name="line.115"></a>
<FONT color="green">116</FONT>                indexCreators = mavenIndexerUtils.getAllIndexCreators();<a name="line.116"></a>
<FONT color="green">117</FONT>                indexer = plexusSisuBridge.lookup( NexusIndexer.class );<a name="line.117"></a>
<FONT color="green">118</FONT>            }<a name="line.118"></a>
<FONT color="green">119</FONT>            catch ( PlexusSisuBridgeException e )<a name="line.119"></a>
<FONT color="green">120</FONT>            {<a name="line.120"></a>
<FONT color="green">121</FONT>                throw new RepositoryAdminException( e.getMessage(), e );<a name="line.121"></a>
<FONT color="green">122</FONT>            }<a name="line.122"></a>
<FONT color="green">123</FONT>            // initialize index context on start and check roles here<a name="line.123"></a>
<FONT color="green">124</FONT>            for ( ManagedRepository managedRepository : getManagedRepositories() )<a name="line.124"></a>
<FONT color="green">125</FONT>            {<a name="line.125"></a>
<FONT color="green">126</FONT>                createIndexContext( managedRepository );<a name="line.126"></a>
<FONT color="green">127</FONT>                addRepositoryRoles( managedRepository.getId() );<a name="line.127"></a>
<FONT color="green">128</FONT>    <a name="line.128"></a>
<FONT color="green">129</FONT>            }<a name="line.129"></a>
<FONT color="green">130</FONT>        }<a name="line.130"></a>
<FONT color="green">131</FONT>    <a name="line.131"></a>
<FONT color="green">132</FONT>        @PreDestroy<a name="line.132"></a>
<FONT color="green">133</FONT>        public void shutdown()<a name="line.133"></a>
<FONT color="green">134</FONT>            throws RepositoryAdminException<a name="line.134"></a>
<FONT color="green">135</FONT>        {<a name="line.135"></a>
<FONT color="green">136</FONT>            try<a name="line.136"></a>
<FONT color="green">137</FONT>            {<a name="line.137"></a>
<FONT color="green">138</FONT>                // close index on shutdown<a name="line.138"></a>
<FONT color="green">139</FONT>                for ( ManagedRepository managedRepository : getManagedRepositories() )<a name="line.139"></a>
<FONT color="green">140</FONT>                {<a name="line.140"></a>
<FONT color="green">141</FONT>                    IndexingContext context = indexer.getIndexingContexts().get( managedRepository.getId() );<a name="line.141"></a>
<FONT color="green">142</FONT>                    if ( context != null )<a name="line.142"></a>
<FONT color="green">143</FONT>                    {<a name="line.143"></a>
<FONT color="green">144</FONT>                        indexer.removeIndexingContext( context, false );<a name="line.144"></a>
<FONT color="green">145</FONT>                    }<a name="line.145"></a>
<FONT color="green">146</FONT>                }<a name="line.146"></a>
<FONT color="green">147</FONT>            }<a name="line.147"></a>
<FONT color="green">148</FONT>            catch ( IOException e )<a name="line.148"></a>
<FONT color="green">149</FONT>            {<a name="line.149"></a>
<FONT color="green">150</FONT>                throw new RepositoryAdminException( e.getMessage(), e );<a name="line.150"></a>
<FONT color="green">151</FONT>            }<a name="line.151"></a>
<FONT color="green">152</FONT>        }<a name="line.152"></a>
<FONT color="green">153</FONT>    <a name="line.153"></a>
<FONT color="green">154</FONT>        public List&lt;ManagedRepository&gt; getManagedRepositories()<a name="line.154"></a>
<FONT color="green">155</FONT>            throws RepositoryAdminException<a name="line.155"></a>
<FONT color="green">156</FONT>        {<a name="line.156"></a>
<FONT color="green">157</FONT>            List&lt;ManagedRepositoryConfiguration&gt; managedRepoConfigs =<a name="line.157"></a>
<FONT color="green">158</FONT>                getArchivaConfiguration().getConfiguration().getManagedRepositories();<a name="line.158"></a>
<FONT color="green">159</FONT>    <a name="line.159"></a>
<FONT color="green">160</FONT>            if ( managedRepoConfigs == null )<a name="line.160"></a>
<FONT color="green">161</FONT>            {<a name="line.161"></a>
<FONT color="green">162</FONT>                return Collections.emptyList();<a name="line.162"></a>
<FONT color="green">163</FONT>            }<a name="line.163"></a>
<FONT color="green">164</FONT>    <a name="line.164"></a>
<FONT color="green">165</FONT>            List&lt;ManagedRepository&gt; managedRepos = new ArrayList&lt;ManagedRepository&gt;( managedRepoConfigs.size() );<a name="line.165"></a>
<FONT color="green">166</FONT>    <a name="line.166"></a>
<FONT color="green">167</FONT>            for ( ManagedRepositoryConfiguration repoConfig : managedRepoConfigs )<a name="line.167"></a>
<FONT color="green">168</FONT>            {<a name="line.168"></a>
<FONT color="green">169</FONT>                ManagedRepository repo =<a name="line.169"></a>
<FONT color="green">170</FONT>                    new ManagedRepository( repoConfig.getId(), repoConfig.getName(), repoConfig.getLocation(),<a name="line.170"></a>
<FONT color="green">171</FONT>                                           repoConfig.getLayout(), repoConfig.isSnapshots(), repoConfig.isReleases(),<a name="line.171"></a>
<FONT color="green">172</FONT>                                           repoConfig.isBlockRedeployments(), repoConfig.getRefreshCronExpression(),<a name="line.172"></a>
<FONT color="green">173</FONT>                                           repoConfig.getIndexDir(), repoConfig.isScanned(), repoConfig.getDaysOlder(),<a name="line.173"></a>
<FONT color="green">174</FONT>                                           repoConfig.getRetentionCount(), repoConfig.isDeleteReleasedSnapshots(),<a name="line.174"></a>
<FONT color="green">175</FONT>                                           repoConfig.isStageRepoNeeded() );<a name="line.175"></a>
<FONT color="green">176</FONT>                repo.setDescription( repoConfig.getDescription() );<a name="line.176"></a>
<FONT color="green">177</FONT>                repo.setSkipPackedIndexCreation( repoConfig.isSkipPackedIndexCreation() );<a name="line.177"></a>
<FONT color="green">178</FONT>                managedRepos.add( repo );<a name="line.178"></a>
<FONT color="green">179</FONT>            }<a name="line.179"></a>
<FONT color="green">180</FONT>    <a name="line.180"></a>
<FONT color="green">181</FONT>            return managedRepos;<a name="line.181"></a>
<FONT color="green">182</FONT>        }<a name="line.182"></a>
<FONT color="green">183</FONT>    <a name="line.183"></a>
<FONT color="green">184</FONT>        public Map&lt;String, ManagedRepository&gt; getManagedRepositoriesAsMap()<a name="line.184"></a>
<FONT color="green">185</FONT>            throws RepositoryAdminException<a name="line.185"></a>
<FONT color="green">186</FONT>        {<a name="line.186"></a>
<FONT color="green">187</FONT>            List&lt;ManagedRepository&gt; managedRepositories = getManagedRepositories();<a name="line.187"></a>
<FONT color="green">188</FONT>            Map&lt;String, ManagedRepository&gt; repositoriesMap =<a name="line.188"></a>
<FONT color="green">189</FONT>                new HashMap&lt;String, ManagedRepository&gt;( managedRepositories.size() );<a name="line.189"></a>
<FONT color="green">190</FONT>            for ( ManagedRepository managedRepository : managedRepositories )<a name="line.190"></a>
<FONT color="green">191</FONT>            {<a name="line.191"></a>
<FONT color="green">192</FONT>                repositoriesMap.put( managedRepository.getId(), managedRepository );<a name="line.192"></a>
<FONT color="green">193</FONT>            }<a name="line.193"></a>
<FONT color="green">194</FONT>            return repositoriesMap;<a name="line.194"></a>
<FONT color="green">195</FONT>        }<a name="line.195"></a>
<FONT color="green">196</FONT>    <a name="line.196"></a>
<FONT color="green">197</FONT>        public ManagedRepository getManagedRepository( String repositoryId )<a name="line.197"></a>
<FONT color="green">198</FONT>            throws RepositoryAdminException<a name="line.198"></a>
<FONT color="green">199</FONT>        {<a name="line.199"></a>
<FONT color="green">200</FONT>            List&lt;ManagedRepository&gt; repos = getManagedRepositories();<a name="line.200"></a>
<FONT color="green">201</FONT>            for ( ManagedRepository repo : repos )<a name="line.201"></a>
<FONT color="green">202</FONT>            {<a name="line.202"></a>
<FONT color="green">203</FONT>                if ( StringUtils.equals( repo.getId(), repositoryId ) )<a name="line.203"></a>
<FONT color="green">204</FONT>                {<a name="line.204"></a>
<FONT color="green">205</FONT>                    return repo;<a name="line.205"></a>
<FONT color="green">206</FONT>                }<a name="line.206"></a>
<FONT color="green">207</FONT>            }<a name="line.207"></a>
<FONT color="green">208</FONT>            return null;<a name="line.208"></a>
<FONT color="green">209</FONT>        }<a name="line.209"></a>
<FONT color="green">210</FONT>    <a name="line.210"></a>
<FONT color="green">211</FONT>        public Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo,<a name="line.211"></a>
<FONT color="green">212</FONT>                                             AuditInformation auditInformation )<a name="line.212"></a>
<FONT color="green">213</FONT>            throws RepositoryAdminException<a name="line.213"></a>
<FONT color="green">214</FONT>        {<a name="line.214"></a>
<FONT color="green">215</FONT>    <a name="line.215"></a>
<FONT color="green">216</FONT>            getRepositoryCommonValidator().basicValidation( managedRepository, false );<a name="line.216"></a>
<FONT color="green">217</FONT>            getRepositoryCommonValidator().validateManagedRepository( managedRepository );<a name="line.217"></a>
<FONT color="green">218</FONT>            triggerAuditEvent( managedRepository.getId(), null, AuditEvent.ADD_MANAGED_REPO, auditInformation );<a name="line.218"></a>
<FONT color="green">219</FONT>            Boolean res =<a name="line.219"></a>
<FONT color="green">220</FONT>                addManagedRepository( managedRepository.getId(), managedRepository.getLayout(), managedRepository.getName(),<a name="line.220"></a>
<FONT color="green">221</FONT>                                      managedRepository.getLocation(), managedRepository.isBlockRedeployments(),<a name="line.221"></a>
<FONT color="green">222</FONT>                                      managedRepository.isReleases(), managedRepository.isSnapshots(), needStageRepo,<a name="line.222"></a>
<FONT color="green">223</FONT>                                      managedRepository.getCronExpression(), managedRepository.getIndexDirectory(),<a name="line.223"></a>
<FONT color="green">224</FONT>                                      managedRepository.getDaysOlder(), managedRepository.getRetentionCount(),<a name="line.224"></a>
<FONT color="green">225</FONT>                                      managedRepository.isDeleteReleasedSnapshots(), managedRepository.getDescription(),<a name="line.225"></a>
<FONT color="green">226</FONT>                                      managedRepository.isSkipPackedIndexCreation(), managedRepository.isScanned(),<a name="line.226"></a>
<FONT color="green">227</FONT>                                      auditInformation, getArchivaConfiguration().getConfiguration() ) != null;<a name="line.227"></a>
<FONT color="green">228</FONT>    <a name="line.228"></a>
<FONT color="green">229</FONT>            createIndexContext( managedRepository );<a name="line.229"></a>
<FONT color="green">230</FONT>            return res;<a name="line.230"></a>
<FONT color="green">231</FONT>    <a name="line.231"></a>
<FONT color="green">232</FONT>        }<a name="line.232"></a>
<FONT color="green">233</FONT>    <a name="line.233"></a>
<FONT color="green">234</FONT>        private ManagedRepositoryConfiguration addManagedRepository( String repoId, String layout, String name,<a name="line.234"></a>
<FONT color="green">235</FONT>                                                                     String location, boolean blockRedeployments,<a name="line.235"></a>
<FONT color="green">236</FONT>                                                                     boolean releasesIncluded, boolean snapshotsIncluded,<a name="line.236"></a>
<FONT color="green">237</FONT>                                                                     boolean stageRepoNeeded, String cronExpression,<a name="line.237"></a>
<FONT color="green">238</FONT>                                                                     String indexDir, int daysOlder, int retentionCount,<a name="line.238"></a>
<FONT color="green">239</FONT>                                                                     boolean deteleReleasedSnapshots, String description,<a name="line.239"></a>
<FONT color="green">240</FONT>                                                                     boolean skipPackedIndexCreation, boolean scanned,<a name="line.240"></a>
<FONT color="green">241</FONT>                                                                     AuditInformation auditInformation,<a name="line.241"></a>
<FONT color="green">242</FONT>                                                                     Configuration config )<a name="line.242"></a>
<FONT color="green">243</FONT>            throws RepositoryAdminException<a name="line.243"></a>
<FONT color="green">244</FONT>        {<a name="line.244"></a>
<FONT color="green">245</FONT>    <a name="line.245"></a>
<FONT color="green">246</FONT>            ManagedRepositoryConfiguration repository = new ManagedRepositoryConfiguration();<a name="line.246"></a>
<FONT color="green">247</FONT>    <a name="line.247"></a>
<FONT color="green">248</FONT>            repository.setId( repoId );<a name="line.248"></a>
<FONT color="green">249</FONT>            repository.setBlockRedeployments( blockRedeployments );<a name="line.249"></a>
<FONT color="green">250</FONT>            repository.setReleases( releasesIncluded );<a name="line.250"></a>
<FONT color="green">251</FONT>            repository.setSnapshots( snapshotsIncluded );<a name="line.251"></a>
<FONT color="green">252</FONT>            repository.setScanned( scanned );<a name="line.252"></a>
<FONT color="green">253</FONT>            repository.setName( name );<a name="line.253"></a>
<FONT color="green">254</FONT>            repository.setLocation( getRepositoryCommonValidator().removeExpressions( location ) );<a name="line.254"></a>
<FONT color="green">255</FONT>            repository.setLayout( layout );<a name="line.255"></a>
<FONT color="green">256</FONT>            repository.setRefreshCronExpression( cronExpression );<a name="line.256"></a>
<FONT color="green">257</FONT>            repository.setIndexDir( indexDir );<a name="line.257"></a>
<FONT color="green">258</FONT>            repository.setDaysOlder( daysOlder );<a name="line.258"></a>
<FONT color="green">259</FONT>            repository.setRetentionCount( retentionCount );<a name="line.259"></a>
<FONT color="green">260</FONT>            repository.setDeleteReleasedSnapshots( deteleReleasedSnapshots );<a name="line.260"></a>
<FONT color="green">261</FONT>            repository.setIndexDir( indexDir );<a name="line.261"></a>
<FONT color="green">262</FONT>            repository.setDescription( description );<a name="line.262"></a>
<FONT color="green">263</FONT>            repository.setSkipPackedIndexCreation( skipPackedIndexCreation );<a name="line.263"></a>
<FONT color="green">264</FONT>            repository.setStageRepoNeeded( stageRepoNeeded );<a name="line.264"></a>
<FONT color="green">265</FONT>    <a name="line.265"></a>
<FONT color="green">266</FONT>            try<a name="line.266"></a>
<FONT color="green">267</FONT>            {<a name="line.267"></a>
<FONT color="green">268</FONT>                addRepository( repository, config );<a name="line.268"></a>
<FONT color="green">269</FONT>                addRepositoryRoles( repository.getId() );<a name="line.269"></a>
<FONT color="green">270</FONT>    <a name="line.270"></a>
<FONT color="green">271</FONT>                if ( stageRepoNeeded )<a name="line.271"></a>
<FONT color="green">272</FONT>                {<a name="line.272"></a>
<FONT color="green">273</FONT>                    ManagedRepositoryConfiguration stagingRepository = getStageRepoConfig( repository );<a name="line.273"></a>
<FONT color="green">274</FONT>                    addRepository( stagingRepository, config );<a name="line.274"></a>
<FONT color="green">275</FONT>                    addRepositoryRoles( stagingRepository.getId() );<a name="line.275"></a>
<FONT color="green">276</FONT>                    triggerAuditEvent( stagingRepository.getId(), null, AuditEvent.ADD_MANAGED_REPO, auditInformation );<a name="line.276"></a>
<FONT color="green">277</FONT>                }<a name="line.277"></a>
<FONT color="green">278</FONT>            }<a name="line.278"></a>
<FONT color="green">279</FONT>            catch ( RoleManagerException e )<a name="line.279"></a>
<FONT color="green">280</FONT>            {<a name="line.280"></a>
<FONT color="green">281</FONT>                throw new RepositoryAdminException( "failed to add repository roles " + e.getMessage(), e );<a name="line.281"></a>
<FONT color="green">282</FONT>            }<a name="line.282"></a>
<FONT color="green">283</FONT>            catch ( IOException e )<a name="line.283"></a>
<FONT color="green">284</FONT>            {<a name="line.284"></a>
<FONT color="green">285</FONT>                throw new RepositoryAdminException( "failed to add repository " + e.getMessage(), e );<a name="line.285"></a>
<FONT color="green">286</FONT>            }<a name="line.286"></a>
<FONT color="green">287</FONT>    <a name="line.287"></a>
<FONT color="green">288</FONT>            saveConfiguration( config );<a name="line.288"></a>
<FONT color="green">289</FONT>    <a name="line.289"></a>
<FONT color="green">290</FONT>            //MRM-1342 Repository statistics report doesn't appear to be working correctly<a name="line.290"></a>
<FONT color="green">291</FONT>            //scan repository when adding of repository is successful<a name="line.291"></a>
<FONT color="green">292</FONT>            try<a name="line.292"></a>
<FONT color="green">293</FONT>            {<a name="line.293"></a>
<FONT color="green">294</FONT>                if ( scanned )<a name="line.294"></a>
<FONT color="green">295</FONT>                {<a name="line.295"></a>
<FONT color="green">296</FONT>                    scanRepository( repoId, true );<a name="line.296"></a>
<FONT color="green">297</FONT>                }<a name="line.297"></a>
<FONT color="green">298</FONT>    <a name="line.298"></a>
<FONT color="green">299</FONT>                // TODO need a better to define scanning or not for staged repo<a name="line.299"></a>
<FONT color="green">300</FONT>                if ( stageRepoNeeded &amp;&amp; scanned )<a name="line.300"></a>
<FONT color="green">301</FONT>                {<a name="line.301"></a>
<FONT color="green">302</FONT>                    ManagedRepositoryConfiguration stagingRepository = getStageRepoConfig( repository );<a name="line.302"></a>
<FONT color="green">303</FONT>                    scanRepository( stagingRepository.getId(), true );<a name="line.303"></a>
<FONT color="green">304</FONT>                }<a name="line.304"></a>
<FONT color="green">305</FONT>            }<a name="line.305"></a>
<FONT color="green">306</FONT>            catch ( Exception e )<a name="line.306"></a>
<FONT color="green">307</FONT>            {<a name="line.307"></a>
<FONT color="green">308</FONT>                log.warn( new StringBuilder( "Unable to scan repository [" ).append( repoId ).append( "]: " ).append(<a name="line.308"></a>
<FONT color="green">309</FONT>                    e.getMessage() ).toString(), e );<a name="line.309"></a>
<FONT color="green">310</FONT>            }<a name="line.310"></a>
<FONT color="green">311</FONT>    <a name="line.311"></a>
<FONT color="green">312</FONT>            return repository;<a name="line.312"></a>
<FONT color="green">313</FONT>        }<a name="line.313"></a>
<FONT color="green">314</FONT>    <a name="line.314"></a>
<FONT color="green">315</FONT>        public Boolean deleteManagedRepository( String repositoryId, AuditInformation auditInformation,<a name="line.315"></a>
<FONT color="green">316</FONT>                                                boolean deleteContent )<a name="line.316"></a>
<FONT color="green">317</FONT>            throws RepositoryAdminException<a name="line.317"></a>
<FONT color="green">318</FONT>        {<a name="line.318"></a>
<FONT color="green">319</FONT>            Configuration config = getArchivaConfiguration().getConfiguration();<a name="line.319"></a>
<FONT color="green">320</FONT>    <a name="line.320"></a>
<FONT color="green">321</FONT>            ManagedRepositoryConfiguration repository = config.findManagedRepositoryById( repositoryId );<a name="line.321"></a>
<FONT color="green">322</FONT>    <a name="line.322"></a>
<FONT color="green">323</FONT>            if ( repository == null )<a name="line.323"></a>
<FONT color="green">324</FONT>            {<a name="line.324"></a>
<FONT color="green">325</FONT>                throw new RepositoryAdminException( "A repository with that id does not exist" );<a name="line.325"></a>
<FONT color="green">326</FONT>            }<a name="line.326"></a>
<FONT color="green">327</FONT>    <a name="line.327"></a>
<FONT color="green">328</FONT>            triggerAuditEvent( repositoryId, null, AuditEvent.DELETE_MANAGED_REPO, auditInformation );<a name="line.328"></a>
<FONT color="green">329</FONT>    <a name="line.329"></a>
<FONT color="green">330</FONT>            deleteManagedRepository( repository, deleteContent, config, false );<a name="line.330"></a>
<FONT color="green">331</FONT>    <a name="line.331"></a>
<FONT color="green">332</FONT>            // stage repo exists ?<a name="line.332"></a>
<FONT color="green">333</FONT>            ManagedRepositoryConfiguration stagingRepository =<a name="line.333"></a>
<FONT color="green">334</FONT>                getArchivaConfiguration().getConfiguration().findManagedRepositoryById( repositoryId + STAGE_REPO_ID_END );<a name="line.334"></a>
<FONT color="green">335</FONT>            if ( stagingRepository != null )<a name="line.335"></a>
<FONT color="green">336</FONT>            {<a name="line.336"></a>
<FONT color="green">337</FONT>                // do not trigger event when deleting the staged one<a name="line.337"></a>
<FONT color="green">338</FONT>                deleteManagedRepository( stagingRepository, deleteContent, config, true );<a name="line.338"></a>
<FONT color="green">339</FONT>            }<a name="line.339"></a>
<FONT color="green">340</FONT>    <a name="line.340"></a>
<FONT color="green">341</FONT>            try<a name="line.341"></a>
<FONT color="green">342</FONT>            {<a name="line.342"></a>
<FONT color="green">343</FONT>                saveConfiguration( config );<a name="line.343"></a>
<FONT color="green">344</FONT>            }<a name="line.344"></a>
<FONT color="green">345</FONT>            catch ( Exception e )<a name="line.345"></a>
<FONT color="green">346</FONT>            {<a name="line.346"></a>
<FONT color="green">347</FONT>                throw new RepositoryAdminException( "Error saving configuration for delete action" + e.getMessage(), e );<a name="line.347"></a>
<FONT color="green">348</FONT>            }<a name="line.348"></a>
<FONT color="green">349</FONT>    <a name="line.349"></a>
<FONT color="green">350</FONT>            return Boolean.TRUE;<a name="line.350"></a>
<FONT color="green">351</FONT>        }<a name="line.351"></a>
<FONT color="green">352</FONT>    <a name="line.352"></a>
<FONT color="green">353</FONT>        private Boolean deleteManagedRepository( ManagedRepositoryConfiguration repository, boolean deleteContent,<a name="line.353"></a>
<FONT color="green">354</FONT>                                                 Configuration config, boolean stagedOne )<a name="line.354"></a>
<FONT color="green">355</FONT>            throws RepositoryAdminException<a name="line.355"></a>
<FONT color="green">356</FONT>        {<a name="line.356"></a>
<FONT color="green">357</FONT>    <a name="line.357"></a>
<FONT color="green">358</FONT>            try<a name="line.358"></a>
<FONT color="green">359</FONT>            {<a name="line.359"></a>
<FONT color="green">360</FONT>                NexusIndexer nexusIndexer = plexusSisuBridge.lookup( NexusIndexer.class );<a name="line.360"></a>
<FONT color="green">361</FONT>    <a name="line.361"></a>
<FONT color="green">362</FONT>                IndexingContext context = nexusIndexer.getIndexingContexts().get( repository.getId() );<a name="line.362"></a>
<FONT color="green">363</FONT>                if ( context != null )<a name="line.363"></a>
<FONT color="green">364</FONT>                {<a name="line.364"></a>
<FONT color="green">365</FONT>                    // delete content only if directory exists<a name="line.365"></a>
<FONT color="green">366</FONT>                    nexusIndexer.removeIndexingContext( context,<a name="line.366"></a>
<FONT color="green">367</FONT>                                                        deleteContent &amp;&amp; context.getIndexDirectoryFile().exists() );<a name="line.367"></a>
<FONT color="green">368</FONT>                }<a name="line.368"></a>
<FONT color="green">369</FONT>            }<a name="line.369"></a>
<FONT color="green">370</FONT>            catch ( PlexusSisuBridgeException e )<a name="line.370"></a>
<FONT color="green">371</FONT>            {<a name="line.371"></a>
<FONT color="green">372</FONT>                throw new RepositoryAdminException( e.getMessage(), e );<a name="line.372"></a>
<FONT color="green">373</FONT>            }<a name="line.373"></a>
<FONT color="green">374</FONT>            catch ( IOException e )<a name="line.374"></a>
<FONT color="green">375</FONT>            {<a name="line.375"></a>
<FONT color="green">376</FONT>                throw new RepositoryAdminException( e.getMessage(), e );<a name="line.376"></a>
<FONT color="green">377</FONT>            }<a name="line.377"></a>
<FONT color="green">378</FONT>            if ( !stagedOne )<a name="line.378"></a>
<FONT color="green">379</FONT>            {<a name="line.379"></a>
<FONT color="green">380</FONT>                RepositorySession repositorySession = getRepositorySessionFactory().createSession();<a name="line.380"></a>
<FONT color="green">381</FONT>                try<a name="line.381"></a>
<FONT color="green">382</FONT>                {<a name="line.382"></a>
<FONT color="green">383</FONT>                    MetadataRepository metadataRepository = repositorySession.getRepository();<a name="line.383"></a>
<FONT color="green">384</FONT>                    metadataRepository.removeRepository( repository.getId() );<a name="line.384"></a>
<FONT color="green">385</FONT>                    log.debug( "call repositoryStatisticsManager.deleteStatistics" );<a name="line.385"></a>
<FONT color="green">386</FONT>                    getRepositoryStatisticsManager().deleteStatistics( metadataRepository, repository.getId() );<a name="line.386"></a>
<FONT color="green">387</FONT>                    repositorySession.save();<a name="line.387"></a>
<FONT color="green">388</FONT>                }<a name="line.388"></a>
<FONT color="green">389</FONT>                catch ( MetadataRepositoryException e )<a name="line.389"></a>
<FONT color="green">390</FONT>                {<a name="line.390"></a>
<FONT color="green">391</FONT>                    //throw new RepositoryAdminException( e.getMessage(), e );<a name="line.391"></a>
<FONT color="green">392</FONT>                    log.warn( "skip error during removing repository from MetadatRepository:" + e.getMessage(), e );<a name="line.392"></a>
<FONT color="green">393</FONT>                }<a name="line.393"></a>
<FONT color="green">394</FONT>                finally<a name="line.394"></a>
<FONT color="green">395</FONT>                {<a name="line.395"></a>
<FONT color="green">396</FONT>                    repositorySession.close();<a name="line.396"></a>
<FONT color="green">397</FONT>                }<a name="line.397"></a>
<FONT color="green">398</FONT>            }<a name="line.398"></a>
<FONT color="green">399</FONT>            config.removeManagedRepository( repository );<a name="line.399"></a>
<FONT color="green">400</FONT>    <a name="line.400"></a>
<FONT color="green">401</FONT>            if ( deleteContent )<a name="line.401"></a>
<FONT color="green">402</FONT>            {<a name="line.402"></a>
<FONT color="green">403</FONT>                // TODO could be async ? as directory can be huge<a name="line.403"></a>
<FONT color="green">404</FONT>                File dir = new File( repository.getLocation() );<a name="line.404"></a>
<FONT color="green">405</FONT>                if ( !FileUtils.deleteQuietly( dir ) )<a name="line.405"></a>
<FONT color="green">406</FONT>                {<a name="line.406"></a>
<FONT color="green">407</FONT>                    throw new RepositoryAdminException( "Cannot delete repository " + dir );<a name="line.407"></a>
<FONT color="green">408</FONT>                }<a name="line.408"></a>
<FONT color="green">409</FONT>            }<a name="line.409"></a>
<FONT color="green">410</FONT>    <a name="line.410"></a>
<FONT color="green">411</FONT>            // olamy: copy list for reading as a unit test in webapp fail with ConcurrentModificationException<a name="line.411"></a>
<FONT color="green">412</FONT>            List&lt;ProxyConnectorConfiguration&gt; proxyConnectors =<a name="line.412"></a>
<FONT color="green">413</FONT>                new ArrayList&lt;ProxyConnectorConfiguration&gt;( config.getProxyConnectors() );<a name="line.413"></a>
<FONT color="green">414</FONT>            for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )<a name="line.414"></a>
<FONT color="green">415</FONT>            {<a name="line.415"></a>
<FONT color="green">416</FONT>                if ( StringUtils.equals( proxyConnector.getSourceRepoId(), repository.getId() ) )<a name="line.416"></a>
<FONT color="green">417</FONT>                {<a name="line.417"></a>
<FONT color="green">418</FONT>                    config.removeProxyConnector( proxyConnector );<a name="line.418"></a>
<FONT color="green">419</FONT>                }<a name="line.419"></a>
<FONT color="green">420</FONT>            }<a name="line.420"></a>
<FONT color="green">421</FONT>    <a name="line.421"></a>
<FONT color="green">422</FONT>            Map&lt;String, List&lt;String&gt;&gt; repoToGroupMap = config.getRepositoryToGroupMap();<a name="line.422"></a>
<FONT color="green">423</FONT>            if ( repoToGroupMap != null )<a name="line.423"></a>
<FONT color="green">424</FONT>            {<a name="line.424"></a>
<FONT color="green">425</FONT>                if ( repoToGroupMap.containsKey( repository.getId() ) )<a name="line.425"></a>
<FONT color="green">426</FONT>                {<a name="line.426"></a>
<FONT color="green">427</FONT>                    List&lt;String&gt; repoGroups = repoToGroupMap.get( repository.getId() );<a name="line.427"></a>
<FONT color="green">428</FONT>                    for ( String repoGroup : repoGroups )<a name="line.428"></a>
<FONT color="green">429</FONT>                    {<a name="line.429"></a>
<FONT color="green">430</FONT>                        // copy to prevent UnsupportedOperationException<a name="line.430"></a>
<FONT color="green">431</FONT>                        RepositoryGroupConfiguration repositoryGroupConfiguration =<a name="line.431"></a>
<FONT color="green">432</FONT>                            config.findRepositoryGroupById( repoGroup );<a name="line.432"></a>
<FONT color="green">433</FONT>                        List&lt;String&gt; repos = new ArrayList&lt;String&gt;( repositoryGroupConfiguration.getRepositories() );<a name="line.433"></a>
<FONT color="green">434</FONT>                        config.removeRepositoryGroup( repositoryGroupConfiguration );<a name="line.434"></a>
<FONT color="green">435</FONT>                        repos.remove( repository.getId() );<a name="line.435"></a>
<FONT color="green">436</FONT>                        repositoryGroupConfiguration.setRepositories( repos );<a name="line.436"></a>
<FONT color="green">437</FONT>                        config.addRepositoryGroup( repositoryGroupConfiguration );<a name="line.437"></a>
<FONT color="green">438</FONT>                    }<a name="line.438"></a>
<FONT color="green">439</FONT>                }<a name="line.439"></a>
<FONT color="green">440</FONT>            }<a name="line.440"></a>
<FONT color="green">441</FONT>    <a name="line.441"></a>
<FONT color="green">442</FONT>            try<a name="line.442"></a>
<FONT color="green">443</FONT>            {<a name="line.443"></a>
<FONT color="green">444</FONT>                removeRepositoryRoles( repository );<a name="line.444"></a>
<FONT color="green">445</FONT>            }<a name="line.445"></a>
<FONT color="green">446</FONT>            catch ( RoleManagerException e )<a name="line.446"></a>
<FONT color="green">447</FONT>            {<a name="line.447"></a>
<FONT color="green">448</FONT>                throw new RepositoryAdminException(<a name="line.448"></a>
<FONT color="green">449</FONT>                    "fail to remove repository roles for repository " + repository.getId() + " : " + e.getMessage(), e );<a name="line.449"></a>
<FONT color="green">450</FONT>            }<a name="line.450"></a>
<FONT color="green">451</FONT>    <a name="line.451"></a>
<FONT color="green">452</FONT>            saveConfiguration( config );<a name="line.452"></a>
<FONT color="green">453</FONT>    <a name="line.453"></a>
<FONT color="green">454</FONT>            return Boolean.TRUE;<a name="line.454"></a>
<FONT color="green">455</FONT>        }<a name="line.455"></a>
<FONT color="green">456</FONT>    <a name="line.456"></a>
<FONT color="green">457</FONT>    <a name="line.457"></a>
<FONT color="green">458</FONT>        public Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo,<a name="line.458"></a>
<FONT color="green">459</FONT>                                                AuditInformation auditInformation, boolean resetStats )<a name="line.459"></a>
<FONT color="green">460</FONT>            throws RepositoryAdminException<a name="line.460"></a>
<FONT color="green">461</FONT>        {<a name="line.461"></a>
<FONT color="green">462</FONT>    <a name="line.462"></a>
<FONT color="green">463</FONT>            log.debug( "updateManagedConfiguration repo {} needStage {} resetStats {} ", managedRepository, needStageRepo,<a name="line.463"></a>
<FONT color="green">464</FONT>                       resetStats );<a name="line.464"></a>
<FONT color="green">465</FONT>    <a name="line.465"></a>
<FONT color="green">466</FONT>            // Ensure that the fields are valid.<a name="line.466"></a>
<FONT color="green">467</FONT>    <a name="line.467"></a>
<FONT color="green">468</FONT>            getRepositoryCommonValidator().basicValidation( managedRepository, true );<a name="line.468"></a>
<FONT color="green">469</FONT>    <a name="line.469"></a>
<FONT color="green">470</FONT>            getRepositoryCommonValidator().validateManagedRepository( managedRepository );<a name="line.470"></a>
<FONT color="green">471</FONT>    <a name="line.471"></a>
<FONT color="green">472</FONT>            Configuration configuration = getArchivaConfiguration().getConfiguration();<a name="line.472"></a>
<FONT color="green">473</FONT>    <a name="line.473"></a>
<FONT color="green">474</FONT>            ManagedRepositoryConfiguration toremove = configuration.findManagedRepositoryById( managedRepository.getId() );<a name="line.474"></a>
<FONT color="green">475</FONT>    <a name="line.475"></a>
<FONT color="green">476</FONT>            boolean updateIndexContext = false;<a name="line.476"></a>
<FONT color="green">477</FONT>    <a name="line.477"></a>
<FONT color="green">478</FONT>            if ( toremove != null )<a name="line.478"></a>
<FONT color="green">479</FONT>            {<a name="line.479"></a>
<FONT color="green">480</FONT>                configuration.removeManagedRepository( toremove );<a name="line.480"></a>
<FONT color="green">481</FONT>    <a name="line.481"></a>
<FONT color="green">482</FONT>                updateIndexContext = !StringUtils.equals( toremove.getIndexDir(), managedRepository.getIndexDirectory() );<a name="line.482"></a>
<FONT color="green">483</FONT>            }<a name="line.483"></a>
<FONT color="green">484</FONT>    <a name="line.484"></a>
<FONT color="green">485</FONT>            ManagedRepositoryConfiguration stagingRepository = getStageRepoConfig( toremove );<a name="line.485"></a>
<FONT color="green">486</FONT>    <a name="line.486"></a>
<FONT color="green">487</FONT>            // TODO remove content from old if path has changed !!!!!<a name="line.487"></a>
<FONT color="green">488</FONT>    <a name="line.488"></a>
<FONT color="green">489</FONT>            if ( stagingRepository != null )<a name="line.489"></a>
<FONT color="green">490</FONT>            {<a name="line.490"></a>
<FONT color="green">491</FONT>                configuration.removeManagedRepository( stagingRepository );<a name="line.491"></a>
<FONT color="green">492</FONT>            }<a name="line.492"></a>
<FONT color="green">493</FONT>    <a name="line.493"></a>
<FONT color="green">494</FONT>            ManagedRepositoryConfiguration managedRepositoryConfiguration =<a name="line.494"></a>
<FONT color="green">495</FONT>                addManagedRepository( managedRepository.getId(), managedRepository.getLayout(), managedRepository.getName(),<a name="line.495"></a>
<FONT color="green">496</FONT>                                      managedRepository.getLocation(), managedRepository.isBlockRedeployments(),<a name="line.496"></a>
<FONT color="green">497</FONT>                                      managedRepository.isReleases(), managedRepository.isSnapshots(), needStageRepo,<a name="line.497"></a>
<FONT color="green">498</FONT>                                      managedRepository.getCronExpression(), managedRepository.getIndexDirectory(),<a name="line.498"></a>
<FONT color="green">499</FONT>                                      managedRepository.getDaysOlder(), managedRepository.getRetentionCount(),<a name="line.499"></a>
<FONT color="green">500</FONT>                                      managedRepository.isDeleteReleasedSnapshots(), managedRepository.getDescription(),<a name="line.500"></a>
<FONT color="green">501</FONT>                                      managedRepository.isSkipPackedIndexCreation(), managedRepository.isScanned(),<a name="line.501"></a>
<FONT color="green">502</FONT>                                      auditInformation, getArchivaConfiguration().getConfiguration() );<a name="line.502"></a>
<FONT color="green">503</FONT>    <a name="line.503"></a>
<FONT color="green">504</FONT>            // Save the repository configuration.<a name="line.504"></a>
<FONT color="green">505</FONT>            RepositorySession repositorySession = getRepositorySessionFactory().createSession();<a name="line.505"></a>
<FONT color="green">506</FONT>    <a name="line.506"></a>
<FONT color="green">507</FONT>            try<a name="line.507"></a>
<FONT color="green">508</FONT>            {<a name="line.508"></a>
<FONT color="green">509</FONT>                triggerAuditEvent( managedRepositoryConfiguration.getId(), null, AuditEvent.MODIFY_MANAGED_REPO,<a name="line.509"></a>
<FONT color="green">510</FONT>                                   auditInformation );<a name="line.510"></a>
<FONT color="green">511</FONT>    <a name="line.511"></a>
<FONT color="green">512</FONT>                saveConfiguration( this.getArchivaConfiguration().getConfiguration() );<a name="line.512"></a>
<FONT color="green">513</FONT>                if ( resetStats )<a name="line.513"></a>
<FONT color="green">514</FONT>                {<a name="line.514"></a>
<FONT color="green">515</FONT>                    log.debug( "call repositoryStatisticsManager.deleteStatistics" );<a name="line.515"></a>
<FONT color="green">516</FONT>                    getRepositoryStatisticsManager().deleteStatistics( repositorySession.getRepository(),<a name="line.516"></a>
<FONT color="green">517</FONT>                                                                       managedRepositoryConfiguration.getId() );<a name="line.517"></a>
<FONT color="green">518</FONT>                    repositorySession.save();<a name="line.518"></a>
<FONT color="green">519</FONT>                }<a name="line.519"></a>
<FONT color="green">520</FONT>    <a name="line.520"></a>
<FONT color="green">521</FONT>            }<a name="line.521"></a>
<FONT color="green">522</FONT>            catch ( MetadataRepositoryException e )<a name="line.522"></a>
<FONT color="green">523</FONT>            {<a name="line.523"></a>
<FONT color="green">524</FONT>                throw new RepositoryAdminException( e.getMessage(), e );<a name="line.524"></a>
<FONT color="green">525</FONT>            }<a name="line.525"></a>
<FONT color="green">526</FONT>            finally<a name="line.526"></a>
<FONT color="green">527</FONT>            {<a name="line.527"></a>
<FONT color="green">528</FONT>                repositorySession.close();<a name="line.528"></a>
<FONT color="green">529</FONT>            }<a name="line.529"></a>
<FONT color="green">530</FONT>    <a name="line.530"></a>
<FONT color="green">531</FONT>            if ( updateIndexContext )<a name="line.531"></a>
<FONT color="green">532</FONT>            {<a name="line.532"></a>
<FONT color="green">533</FONT>                try<a name="line.533"></a>
<FONT color="green">534</FONT>                {<a name="line.534"></a>
<FONT color="green">535</FONT>                    IndexingContext indexingContext = indexer.getIndexingContexts().get( managedRepository.getId() );<a name="line.535"></a>
<FONT color="green">536</FONT>                    if ( indexingContext != null )<a name="line.536"></a>
<FONT color="green">537</FONT>                    {<a name="line.537"></a>
<FONT color="green">538</FONT>                        indexer.removeIndexingContext( indexingContext, true );<a name="line.538"></a>
<FONT color="green">539</FONT>                    }<a name="line.539"></a>
<FONT color="green">540</FONT>    <a name="line.540"></a>
<FONT color="green">541</FONT>                    // delete directory too as only content is deleted<a name="line.541"></a>
<FONT color="green">542</FONT>                    File indexDirectory = indexingContext.getIndexDirectoryFile();<a name="line.542"></a>
<FONT color="green">543</FONT>                    FileUtils.deleteDirectory( indexDirectory );<a name="line.543"></a>
<FONT color="green">544</FONT>    <a name="line.544"></a>
<FONT color="green">545</FONT>                    createIndexContext( managedRepository );<a name="line.545"></a>
<FONT color="green">546</FONT>                }<a name="line.546"></a>
<FONT color="green">547</FONT>                catch ( IOException e )<a name="line.547"></a>
<FONT color="green">548</FONT>                {<a name="line.548"></a>
<FONT color="green">549</FONT>                    throw new RepositoryAdminException( e.getMessage(), e );<a name="line.549"></a>
<FONT color="green">550</FONT>                }<a name="line.550"></a>
<FONT color="green">551</FONT>            }<a name="line.551"></a>
<FONT color="green">552</FONT>    <a name="line.552"></a>
<FONT color="green">553</FONT>            return true;<a name="line.553"></a>
<FONT color="green">554</FONT>        }<a name="line.554"></a>
<FONT color="green">555</FONT>    <a name="line.555"></a>
<FONT color="green">556</FONT>        //--------------------------<a name="line.556"></a>
<FONT color="green">557</FONT>        // utils methods<a name="line.557"></a>
<FONT color="green">558</FONT>        //--------------------------<a name="line.558"></a>
<FONT color="green">559</FONT>    <a name="line.559"></a>
<FONT color="green">560</FONT>    <a name="line.560"></a>
<FONT color="green">561</FONT>        protected void addRepository( ManagedRepositoryConfiguration repository, Configuration configuration )<a name="line.561"></a>
<FONT color="green">562</FONT>            throws RepositoryAdminException, IOException<a name="line.562"></a>
<FONT color="green">563</FONT>        {<a name="line.563"></a>
<FONT color="green">564</FONT>            // Normalize the path<a name="line.564"></a>
<FONT color="green">565</FONT>            File file = new File( repository.getLocation() );<a name="line.565"></a>
<FONT color="green">566</FONT>            if ( !file.isAbsolute() )<a name="line.566"></a>
<FONT color="green">567</FONT>            {<a name="line.567"></a>
<FONT color="green">568</FONT>                // add appserver.base/repositories<a name="line.568"></a>
<FONT color="green">569</FONT>                file = new File( getRegistry().getString( "appserver.base" ) + File.separatorChar + "repositories",<a name="line.569"></a>
<FONT color="green">570</FONT>                                 repository.getLocation() );<a name="line.570"></a>
<FONT color="green">571</FONT>            }<a name="line.571"></a>
<FONT color="green">572</FONT>            repository.setLocation( file.getCanonicalPath() );<a name="line.572"></a>
<FONT color="green">573</FONT>            if ( !file.exists() )<a name="line.573"></a>
<FONT color="green">574</FONT>            {<a name="line.574"></a>
<FONT color="green">575</FONT>                file.mkdirs();<a name="line.575"></a>
<FONT color="green">576</FONT>            }<a name="line.576"></a>
<FONT color="green">577</FONT>            if ( !file.exists() || !file.isDirectory() )<a name="line.577"></a>
<FONT color="green">578</FONT>            {<a name="line.578"></a>
<FONT color="green">579</FONT>                throw new RepositoryAdminException(<a name="line.579"></a>
<FONT color="green">580</FONT>                    "Unable to add repository - no write access, can not create the root directory: " + file );<a name="line.580"></a>
<FONT color="green">581</FONT>            }<a name="line.581"></a>
<FONT color="green">582</FONT>    <a name="line.582"></a>
<FONT color="green">583</FONT>            configuration.addManagedRepository( repository );<a name="line.583"></a>
<FONT color="green">584</FONT>    <a name="line.584"></a>
<FONT color="green">585</FONT>        }<a name="line.585"></a>
<FONT color="green">586</FONT>    <a name="line.586"></a>
<FONT color="green">587</FONT>        public IndexingContext createIndexContext( ManagedRepository repository )<a name="line.587"></a>
<FONT color="green">588</FONT>            throws RepositoryAdminException<a name="line.588"></a>
<FONT color="green">589</FONT>        {<a name="line.589"></a>
<FONT color="green">590</FONT>    <a name="line.590"></a>
<FONT color="green">591</FONT>            IndexingContext context = indexer.getIndexingContexts().get( repository.getId() );<a name="line.591"></a>
<FONT color="green">592</FONT>    <a name="line.592"></a>
<FONT color="green">593</FONT>            if ( context != null )<a name="line.593"></a>
<FONT color="green">594</FONT>            {<a name="line.594"></a>
<FONT color="green">595</FONT>                log.debug( "skip creating repository indexingContent with id {} as already exists", repository.getId() );<a name="line.595"></a>
<FONT color="green">596</FONT>                return context;<a name="line.596"></a>
<FONT color="green">597</FONT>            }<a name="line.597"></a>
<FONT color="green">598</FONT>    <a name="line.598"></a>
<FONT color="green">599</FONT>            // take care first about repository location as can be relative<a name="line.599"></a>
<FONT color="green">600</FONT>            File repositoryDirectory = new File( repository.getLocation() );<a name="line.600"></a>
<FONT color="green">601</FONT>    <a name="line.601"></a>
<FONT color="green">602</FONT>            if ( !repositoryDirectory.isAbsolute() )<a name="line.602"></a>
<FONT color="green">603</FONT>            {<a name="line.603"></a>
<FONT color="green">604</FONT>                repositoryDirectory =<a name="line.604"></a>
<FONT color="green">605</FONT>                    new File( getRegistry().getString( "appserver.base" ) + File.separatorChar + "repositories",<a name="line.605"></a>
<FONT color="green">606</FONT>                              repository.getLocation() );<a name="line.606"></a>
<FONT color="green">607</FONT>            }<a name="line.607"></a>
<FONT color="green">608</FONT>    <a name="line.608"></a>
<FONT color="green">609</FONT>            if ( !repositoryDirectory.exists() )<a name="line.609"></a>
<FONT color="green">610</FONT>            {<a name="line.610"></a>
<FONT color="green">611</FONT>                repositoryDirectory.mkdirs();<a name="line.611"></a>
<FONT color="green">612</FONT>            }<a name="line.612"></a>
<FONT color="green">613</FONT>    <a name="line.613"></a>
<FONT color="green">614</FONT>            try<a name="line.614"></a>
<FONT color="green">615</FONT>            {<a name="line.615"></a>
<FONT color="green">616</FONT>    <a name="line.616"></a>
<FONT color="green">617</FONT>                String indexDir = repository.getIndexDirectory();<a name="line.617"></a>
<FONT color="green">618</FONT>                //File managedRepository = new File( repository.getLocation() );<a name="line.618"></a>
<FONT color="green">619</FONT>    <a name="line.619"></a>
<FONT color="green">620</FONT>                File indexDirectory = null;<a name="line.620"></a>
<FONT color="green">621</FONT>                if ( StringUtils.isNotBlank( indexDir ) )<a name="line.621"></a>
<FONT color="green">622</FONT>                {<a name="line.622"></a>
<FONT color="green">623</FONT>                    indexDirectory = new File( repository.getIndexDirectory() );<a name="line.623"></a>
<FONT color="green">624</FONT>                    // not absolute so create it in repository directory<a name="line.624"></a>
<FONT color="green">625</FONT>                    if ( !indexDirectory.isAbsolute() )<a name="line.625"></a>
<FONT color="green">626</FONT>                    {<a name="line.626"></a>
<FONT color="green">627</FONT>                        indexDirectory = new File( repositoryDirectory, repository.getIndexDirectory() );<a name="line.627"></a>
<FONT color="green">628</FONT>                    }<a name="line.628"></a>
<FONT color="green">629</FONT>                    repository.setIndexDirectory( indexDirectory.getAbsolutePath() );<a name="line.629"></a>
<FONT color="green">630</FONT>                }<a name="line.630"></a>
<FONT color="green">631</FONT>                else<a name="line.631"></a>
<FONT color="green">632</FONT>                {<a name="line.632"></a>
<FONT color="green">633</FONT>                    indexDirectory = new File( repositoryDirectory, ".indexer" );<a name="line.633"></a>
<FONT color="green">634</FONT>                    if ( !repositoryDirectory.isAbsolute() )<a name="line.634"></a>
<FONT color="green">635</FONT>                    {<a name="line.635"></a>
<FONT color="green">636</FONT>                        indexDirectory = new File( repositoryDirectory, ".indexer" );<a name="line.636"></a>
<FONT color="green">637</FONT>                    }<a name="line.637"></a>
<FONT color="green">638</FONT>                    repository.setIndexDirectory( indexDirectory.getAbsolutePath() );<a name="line.638"></a>
<FONT color="green">639</FONT>                }<a name="line.639"></a>
<FONT color="green">640</FONT>    <a name="line.640"></a>
<FONT color="green">641</FONT>                if ( !indexDirectory.exists() )<a name="line.641"></a>
<FONT color="green">642</FONT>                {<a name="line.642"></a>
<FONT color="green">643</FONT>                    indexDirectory.mkdirs();<a name="line.643"></a>
<FONT color="green">644</FONT>                }<a name="line.644"></a>
<FONT color="green">645</FONT>    <a name="line.645"></a>
<FONT color="green">646</FONT>                context = indexer.getIndexingContexts().get( repository.getId() );<a name="line.646"></a>
<FONT color="green">647</FONT>    <a name="line.647"></a>
<FONT color="green">648</FONT>                if ( context == null )<a name="line.648"></a>
<FONT color="green">649</FONT>                {<a name="line.649"></a>
<FONT color="green">650</FONT>                    context = indexer.addIndexingContext( repository.getId(), repository.getId(), repositoryDirectory,<a name="line.650"></a>
<FONT color="green">651</FONT>                                                          indexDirectory,<a name="line.651"></a>
<FONT color="green">652</FONT>                                                          repositoryDirectory.toURI().toURL().toExternalForm(),<a name="line.652"></a>
<FONT color="green">653</FONT>                                                          indexDirectory.toURI().toURL().toString(), indexCreators );<a name="line.653"></a>
<FONT color="green">654</FONT>    <a name="line.654"></a>
<FONT color="green">655</FONT>                    context.setSearchable( repository.isScanned() );<a name="line.655"></a>
<FONT color="green">656</FONT>                }<a name="line.656"></a>
<FONT color="green">657</FONT>                return context;<a name="line.657"></a>
<FONT color="green">658</FONT>            }<a name="line.658"></a>
<FONT color="green">659</FONT>            catch ( MalformedURLException e )<a name="line.659"></a>
<FONT color="green">660</FONT>            {<a name="line.660"></a>
<FONT color="green">661</FONT>                throw new RepositoryAdminException( e.getMessage(), e );<a name="line.661"></a>
<FONT color="green">662</FONT>            }<a name="line.662"></a>
<FONT color="green">663</FONT>            catch ( IOException e )<a name="line.663"></a>
<FONT color="green">664</FONT>            {<a name="line.664"></a>
<FONT color="green">665</FONT>                throw new RepositoryAdminException( e.getMessage(), e );<a name="line.665"></a>
<FONT color="green">666</FONT>            }<a name="line.666"></a>
<FONT color="green">667</FONT>            catch ( UnsupportedExistingLuceneIndexException e )<a name="line.667"></a>
<FONT color="green">668</FONT>            {<a name="line.668"></a>
<FONT color="green">669</FONT>                throw new RepositoryAdminException( e.getMessage(), e );<a name="line.669"></a>
<FONT color="green">670</FONT>            }<a name="line.670"></a>
<FONT color="green">671</FONT>        }<a name="line.671"></a>
<FONT color="green">672</FONT>    <a name="line.672"></a>
<FONT color="green">673</FONT>        private ManagedRepositoryConfiguration getStageRepoConfig( ManagedRepositoryConfiguration repository )<a name="line.673"></a>
<FONT color="green">674</FONT>        {<a name="line.674"></a>
<FONT color="green">675</FONT>            ManagedRepositoryConfiguration stagingRepository = new ManagedRepositoryConfiguration();<a name="line.675"></a>
<FONT color="green">676</FONT>            stagingRepository.setId( repository.getId() + STAGE_REPO_ID_END );<a name="line.676"></a>
<FONT color="green">677</FONT>            stagingRepository.setLayout( repository.getLayout() );<a name="line.677"></a>
<FONT color="green">678</FONT>            stagingRepository.setName( repository.getName() + STAGE_REPO_ID_END );<a name="line.678"></a>
<FONT color="green">679</FONT>            stagingRepository.setBlockRedeployments( repository.isBlockRedeployments() );<a name="line.679"></a>
<FONT color="green">680</FONT>            stagingRepository.setDaysOlder( repository.getDaysOlder() );<a name="line.680"></a>
<FONT color="green">681</FONT>            stagingRepository.setDeleteReleasedSnapshots( repository.isDeleteReleasedSnapshots() );<a name="line.681"></a>
<FONT color="green">682</FONT>    <a name="line.682"></a>
<FONT color="green">683</FONT>            String path = repository.getLocation();<a name="line.683"></a>
<FONT color="green">684</FONT>            int lastIndex = path.replace( '\\', '/' ).lastIndexOf( '/' );<a name="line.684"></a>
<FONT color="green">685</FONT>            stagingRepository.setLocation( path.substring( 0, lastIndex ) + "/" + stagingRepository.getId() );<a name="line.685"></a>
<FONT color="green">686</FONT>    <a name="line.686"></a>
<FONT color="green">687</FONT>            if ( StringUtils.isNotBlank( repository.getIndexDir() ) )<a name="line.687"></a>
<FONT color="green">688</FONT>            {<a name="line.688"></a>
<FONT color="green">689</FONT>                File indexDir = new File( repository.getIndexDir() );<a name="line.689"></a>
<FONT color="green">690</FONT>                // in case of absolute dir do not use the same<a name="line.690"></a>
<FONT color="green">691</FONT>                if ( indexDir.isAbsolute() )<a name="line.691"></a>
<FONT color="green">692</FONT>                {<a name="line.692"></a>
<FONT color="green">693</FONT>                    stagingRepository.setIndexDir( stagingRepository.getLocation() + "/.index" );<a name="line.693"></a>
<FONT color="green">694</FONT>                }<a name="line.694"></a>
<FONT color="green">695</FONT>                else<a name="line.695"></a>
<FONT color="green">696</FONT>                {<a name="line.696"></a>
<FONT color="green">697</FONT>                    stagingRepository.setIndexDir( repository.getIndexDir() );<a name="line.697"></a>
<FONT color="green">698</FONT>                }<a name="line.698"></a>
<FONT color="green">699</FONT>            }<a name="line.699"></a>
<FONT color="green">700</FONT>            stagingRepository.setRefreshCronExpression( repository.getRefreshCronExpression() );<a name="line.700"></a>
<FONT color="green">701</FONT>            stagingRepository.setReleases( repository.isReleases() );<a name="line.701"></a>
<FONT color="green">702</FONT>            stagingRepository.setRetentionCount( repository.getRetentionCount() );<a name="line.702"></a>
<FONT color="green">703</FONT>            stagingRepository.setScanned( repository.isScanned() );<a name="line.703"></a>
<FONT color="green">704</FONT>            stagingRepository.setSnapshots( repository.isSnapshots() );<a name="line.704"></a>
<FONT color="green">705</FONT>            stagingRepository.setSkipPackedIndexCreation( repository.isSkipPackedIndexCreation() );<a name="line.705"></a>
<FONT color="green">706</FONT>            // do not duplicate description<a name="line.706"></a>
<FONT color="green">707</FONT>            //stagingRepository.getDescription("")<a name="line.707"></a>
<FONT color="green">708</FONT>            return stagingRepository;<a name="line.708"></a>
<FONT color="green">709</FONT>        }<a name="line.709"></a>
<FONT color="green">710</FONT>    <a name="line.710"></a>
<FONT color="green">711</FONT>        public Boolean scanRepository( String repositoryId, boolean fullScan )<a name="line.711"></a>
<FONT color="green">712</FONT>        {<a name="line.712"></a>
<FONT color="green">713</FONT>            if ( getRepositoryTaskScheduler().isProcessingRepositoryTask( repositoryId ) )<a name="line.713"></a>
<FONT color="green">714</FONT>            {<a name="line.714"></a>
<FONT color="green">715</FONT>                log.info( "scanning of repository with id {} already scheduled", repositoryId );<a name="line.715"></a>
<FONT color="green">716</FONT>            }<a name="line.716"></a>
<FONT color="green">717</FONT>            RepositoryTask task = new RepositoryTask();<a name="line.717"></a>
<FONT color="green">718</FONT>            task.setRepositoryId( repositoryId );<a name="line.718"></a>
<FONT color="green">719</FONT>            task.setScanAll( fullScan );<a name="line.719"></a>
<FONT color="green">720</FONT>            try<a name="line.720"></a>
<FONT color="green">721</FONT>            {<a name="line.721"></a>
<FONT color="green">722</FONT>                getRepositoryTaskScheduler().queueTask( task );<a name="line.722"></a>
<FONT color="green">723</FONT>            }<a name="line.723"></a>
<FONT color="green">724</FONT>            catch ( TaskQueueException e )<a name="line.724"></a>
<FONT color="green">725</FONT>            {<a name="line.725"></a>
<FONT color="green">726</FONT>                log.error( "failed to schedule scanning of repo with id {}", repositoryId, e );<a name="line.726"></a>
<FONT color="green">727</FONT>                return false;<a name="line.727"></a>
<FONT color="green">728</FONT>            }<a name="line.728"></a>
<FONT color="green">729</FONT>            return true;<a name="line.729"></a>
<FONT color="green">730</FONT>        }<a name="line.730"></a>
<FONT color="green">731</FONT>    <a name="line.731"></a>
<FONT color="green">732</FONT>    <a name="line.732"></a>
<FONT color="green">733</FONT>        private void addRepositoryRoles( ManagedRepository newRepository )<a name="line.733"></a>
<FONT color="green">734</FONT>            throws RoleManagerException<a name="line.734"></a>
<FONT color="green">735</FONT>        {<a name="line.735"></a>
<FONT color="green">736</FONT>            String repoId = newRepository.getId();<a name="line.736"></a>
<FONT color="green">737</FONT>    <a name="line.737"></a>
<FONT color="green">738</FONT>            // TODO: double check these are configured on start up<a name="line.738"></a>
<FONT color="green">739</FONT>            // TODO: belongs in the business logic<a name="line.739"></a>
<FONT color="green">740</FONT>    <a name="line.740"></a>
<FONT color="green">741</FONT>            if ( !getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId ) )<a name="line.741"></a>
<FONT color="green">742</FONT>            {<a name="line.742"></a>
<FONT color="green">743</FONT>                getRoleManager().createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId );<a name="line.743"></a>
<FONT color="green">744</FONT>            }<a name="line.744"></a>
<FONT color="green">745</FONT>    <a name="line.745"></a>
<FONT color="green">746</FONT>            if ( !getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId ) )<a name="line.746"></a>
<FONT color="green">747</FONT>            {<a name="line.747"></a>
<FONT color="green">748</FONT>                getRoleManager().createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId );<a name="line.748"></a>
<FONT color="green">749</FONT>            }<a name="line.749"></a>
<FONT color="green">750</FONT>        }<a name="line.750"></a>
<FONT color="green">751</FONT>    <a name="line.751"></a>
<FONT color="green">752</FONT>    <a name="line.752"></a>
<FONT color="green">753</FONT>        private void addRepositoryRoles( String repoId )<a name="line.753"></a>
<FONT color="green">754</FONT>            throws RoleManagerException<a name="line.754"></a>
<FONT color="green">755</FONT>        {<a name="line.755"></a>
<FONT color="green">756</FONT>            // TODO: double check these are configured on start up<a name="line.756"></a>
<FONT color="green">757</FONT>            // TODO: belongs in the business logic<a name="line.757"></a>
<FONT color="green">758</FONT>    <a name="line.758"></a>
<FONT color="green">759</FONT>            if ( !getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId ) )<a name="line.759"></a>
<FONT color="green">760</FONT>            {<a name="line.760"></a>
<FONT color="green">761</FONT>                getRoleManager().createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId );<a name="line.761"></a>
<FONT color="green">762</FONT>            }<a name="line.762"></a>
<FONT color="green">763</FONT>    <a name="line.763"></a>
<FONT color="green">764</FONT>            if ( !getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId ) )<a name="line.764"></a>
<FONT color="green">765</FONT>            {<a name="line.765"></a>
<FONT color="green">766</FONT>                getRoleManager().createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId );<a name="line.766"></a>
<FONT color="green">767</FONT>            }<a name="line.767"></a>
<FONT color="green">768</FONT>        }<a name="line.768"></a>
<FONT color="green">769</FONT>    <a name="line.769"></a>
<FONT color="green">770</FONT>        protected void removeRepositoryRoles( ManagedRepositoryConfiguration existingRepository )<a name="line.770"></a>
<FONT color="green">771</FONT>            throws RoleManagerException<a name="line.771"></a>
<FONT color="green">772</FONT>        {<a name="line.772"></a>
<FONT color="green">773</FONT>            String repoId = existingRepository.getId();<a name="line.773"></a>
<FONT color="green">774</FONT>    <a name="line.774"></a>
<FONT color="green">775</FONT>            if ( getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId ) )<a name="line.775"></a>
<FONT color="green">776</FONT>            {<a name="line.776"></a>
<FONT color="green">777</FONT>                getRoleManager().removeTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId );<a name="line.777"></a>
<FONT color="green">778</FONT>            }<a name="line.778"></a>
<FONT color="green">779</FONT>    <a name="line.779"></a>
<FONT color="green">780</FONT>            if ( getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId ) )<a name="line.780"></a>
<FONT color="green">781</FONT>            {<a name="line.781"></a>
<FONT color="green">782</FONT>                getRoleManager().removeTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId );<a name="line.782"></a>
<FONT color="green">783</FONT>            }<a name="line.783"></a>
<FONT color="green">784</FONT>    <a name="line.784"></a>
<FONT color="green">785</FONT>            log.debug( "removed user roles associated with repository {}", repoId );<a name="line.785"></a>
<FONT color="green">786</FONT>        }<a name="line.786"></a>
<FONT color="green">787</FONT>    <a name="line.787"></a>
<FONT color="green">788</FONT>        //--------------------------<a name="line.788"></a>
<FONT color="green">789</FONT>        // setters/getters<a name="line.789"></a>
<FONT color="green">790</FONT>        //--------------------------<a name="line.790"></a>
<FONT color="green">791</FONT>    <a name="line.791"></a>
<FONT color="green">792</FONT>    <a name="line.792"></a>
<FONT color="green">793</FONT>        public RoleManager getRoleManager()<a name="line.793"></a>
<FONT color="green">794</FONT>        {<a name="line.794"></a>
<FONT color="green">795</FONT>            return roleManager;<a name="line.795"></a>
<FONT color="green">796</FONT>        }<a name="line.796"></a>
<FONT color="green">797</FONT>    <a name="line.797"></a>
<FONT color="green">798</FONT>        public void setRoleManager( RoleManager roleManager )<a name="line.798"></a>
<FONT color="green">799</FONT>        {<a name="line.799"></a>
<FONT color="green">800</FONT>            this.roleManager = roleManager;<a name="line.800"></a>
<FONT color="green">801</FONT>        }<a name="line.801"></a>
<FONT color="green">802</FONT>    <a name="line.802"></a>
<FONT color="green">803</FONT>        public RepositoryStatisticsManager getRepositoryStatisticsManager()<a name="line.803"></a>
<FONT color="green">804</FONT>        {<a name="line.804"></a>
<FONT color="green">805</FONT>            return repositoryStatisticsManager;<a name="line.805"></a>
<FONT color="green">806</FONT>        }<a name="line.806"></a>
<FONT color="green">807</FONT>    <a name="line.807"></a>
<FONT color="green">808</FONT>        public void setRepositoryStatisticsManager( RepositoryStatisticsManager repositoryStatisticsManager )<a name="line.808"></a>
<FONT color="green">809</FONT>        {<a name="line.809"></a>
<FONT color="green">810</FONT>            this.repositoryStatisticsManager = repositoryStatisticsManager;<a name="line.810"></a>
<FONT color="green">811</FONT>        }<a name="line.811"></a>
<FONT color="green">812</FONT>    <a name="line.812"></a>
<FONT color="green">813</FONT>        public RepositorySessionFactory getRepositorySessionFactory()<a name="line.813"></a>
<FONT color="green">814</FONT>        {<a name="line.814"></a>
<FONT color="green">815</FONT>            return repositorySessionFactory;<a name="line.815"></a>
<FONT color="green">816</FONT>        }<a name="line.816"></a>
<FONT color="green">817</FONT>    <a name="line.817"></a>
<FONT color="green">818</FONT>        public void setRepositorySessionFactory( RepositorySessionFactory repositorySessionFactory )<a name="line.818"></a>
<FONT color="green">819</FONT>        {<a name="line.819"></a>
<FONT color="green">820</FONT>            this.repositorySessionFactory = repositorySessionFactory;<a name="line.820"></a>
<FONT color="green">821</FONT>        }<a name="line.821"></a>
<FONT color="green">822</FONT>    <a name="line.822"></a>
<FONT color="green">823</FONT>    <a name="line.823"></a>
<FONT color="green">824</FONT>        public RepositoryArchivaTaskScheduler getRepositoryTaskScheduler()<a name="line.824"></a>
<FONT color="green">825</FONT>        {<a name="line.825"></a>
<FONT color="green">826</FONT>            return repositoryTaskScheduler;<a name="line.826"></a>
<FONT color="green">827</FONT>        }<a name="line.827"></a>
<FONT color="green">828</FONT>    <a name="line.828"></a>
<FONT color="green">829</FONT>        public void setRepositoryTaskScheduler( RepositoryArchivaTaskScheduler repositoryTaskScheduler )<a name="line.829"></a>
<FONT color="green">830</FONT>        {<a name="line.830"></a>
<FONT color="green">831</FONT>            this.repositoryTaskScheduler = repositoryTaskScheduler;<a name="line.831"></a>
<FONT color="green">832</FONT>        }<a name="line.832"></a>
<FONT color="green">833</FONT>    <a name="line.833"></a>
<FONT color="green">834</FONT>        public PlexusSisuBridge getPlexusSisuBridge()<a name="line.834"></a>
<FONT color="green">835</FONT>        {<a name="line.835"></a>
<FONT color="green">836</FONT>            return plexusSisuBridge;<a name="line.836"></a>
<FONT color="green">837</FONT>        }<a name="line.837"></a>
<FONT color="green">838</FONT>    <a name="line.838"></a>
<FONT color="green">839</FONT>        public void setPlexusSisuBridge( PlexusSisuBridge plexusSisuBridge )<a name="line.839"></a>
<FONT color="green">840</FONT>        {<a name="line.840"></a>
<FONT color="green">841</FONT>            this.plexusSisuBridge = plexusSisuBridge;<a name="line.841"></a>
<FONT color="green">842</FONT>        }<a name="line.842"></a>
<FONT color="green">843</FONT>    <a name="line.843"></a>
<FONT color="green">844</FONT>        public MavenIndexerUtils getMavenIndexerUtils()<a name="line.844"></a>
<FONT color="green">845</FONT>        {<a name="line.845"></a>
<FONT color="green">846</FONT>            return mavenIndexerUtils;<a name="line.846"></a>
<FONT color="green">847</FONT>        }<a name="line.847"></a>
<FONT color="green">848</FONT>    <a name="line.848"></a>
<FONT color="green">849</FONT>        public void setMavenIndexerUtils( MavenIndexerUtils mavenIndexerUtils )<a name="line.849"></a>
<FONT color="green">850</FONT>        {<a name="line.850"></a>
<FONT color="green">851</FONT>            this.mavenIndexerUtils = mavenIndexerUtils;<a name="line.851"></a>
<FONT color="green">852</FONT>        }<a name="line.852"></a>
<FONT color="green">853</FONT>    <a name="line.853"></a>
<FONT color="green">854</FONT>        public NexusIndexer getIndexer()<a name="line.854"></a>
<FONT color="green">855</FONT>        {<a name="line.855"></a>
<FONT color="green">856</FONT>            return indexer;<a name="line.856"></a>
<FONT color="green">857</FONT>        }<a name="line.857"></a>
<FONT color="green">858</FONT>    <a name="line.858"></a>
<FONT color="green">859</FONT>        public void setIndexer( NexusIndexer indexer )<a name="line.859"></a>
<FONT color="green">860</FONT>        {<a name="line.860"></a>
<FONT color="green">861</FONT>            this.indexer = indexer;<a name="line.861"></a>
<FONT color="green">862</FONT>        }<a name="line.862"></a>
<FONT color="green">863</FONT>    <a name="line.863"></a>
<FONT color="green">864</FONT>        public List&lt;? extends IndexCreator&gt; getIndexCreators()<a name="line.864"></a>
<FONT color="green">865</FONT>        {<a name="line.865"></a>
<FONT color="green">866</FONT>            return indexCreators;<a name="line.866"></a>
<FONT color="green">867</FONT>        }<a name="line.867"></a>
<FONT color="green">868</FONT>    <a name="line.868"></a>
<FONT color="green">869</FONT>        public void setIndexCreators( List&lt;? extends IndexCreator&gt; indexCreators )<a name="line.869"></a>
<FONT color="green">870</FONT>        {<a name="line.870"></a>
<FONT color="green">871</FONT>            this.indexCreators = indexCreators;<a name="line.871"></a>
<FONT color="green">872</FONT>        }<a name="line.872"></a>
<FONT color="green">873</FONT>    }<a name="line.873"></a>




























































</PRE>
</BODY>
</HTML>