<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    package org.apache.archiva.repository.content.legacy;<a name="line.1"></a>
<FONT color="green">002</FONT>    <a name="line.2"></a>
<FONT color="green">003</FONT>    /*<a name="line.3"></a>
<FONT color="green">004</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.4"></a>
<FONT color="green">005</FONT>     * or more contributor license agreements.  See the NOTICE file<a name="line.5"></a>
<FONT color="green">006</FONT>     * distributed with this work for additional information<a name="line.6"></a>
<FONT color="green">007</FONT>     * regarding copyright ownership.  The ASF licenses this file<a name="line.7"></a>
<FONT color="green">008</FONT>     * to you under the Apache License, Version 2.0 (the<a name="line.8"></a>
<FONT color="green">009</FONT>     * "License"); you may not use this file except in compliance<a name="line.9"></a>
<FONT color="green">010</FONT>     * with the License.  You may obtain a copy of the License at<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     *  http://www.apache.org/licenses/LICENSE-2.0<a name="line.12"></a>
<FONT color="green">013</FONT>     *<a name="line.13"></a>
<FONT color="green">014</FONT>     * Unless required by applicable law or agreed to in writing,<a name="line.14"></a>
<FONT color="green">015</FONT>     * software distributed under the License is distributed on an<a name="line.15"></a>
<FONT color="green">016</FONT>     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.16"></a>
<FONT color="green">017</FONT>     * KIND, either express or implied.  See the License for the<a name="line.17"></a>
<FONT color="green">018</FONT>     * specific language governing permissions and limitations<a name="line.18"></a>
<FONT color="green">019</FONT>     * under the License.<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    <a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.archiva.admin.model.beans.ManagedRepository;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.archiva.common.utils.PathUtil;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.archiva.configuration.FileTypes;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.archiva.model.ArchivaArtifact;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.archiva.model.ArtifactReference;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.archiva.model.ProjectReference;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.archiva.model.VersionedReference;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.archiva.repository.ContentNotFoundException;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.archiva.repository.ManagedRepositoryContent;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.archiva.repository.RepositoryException;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.archiva.repository.layout.LayoutException;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.commons.collections.CollectionUtils;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.apache.commons.lang.StringUtils;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.springframework.context.annotation.Scope;<a name="line.35"></a>
<FONT color="green">036</FONT>    import org.springframework.stereotype.Service;<a name="line.36"></a>
<FONT color="green">037</FONT>    <a name="line.37"></a>
<FONT color="green">038</FONT>    import javax.inject.Inject;<a name="line.38"></a>
<FONT color="green">039</FONT>    import java.io.File;<a name="line.39"></a>
<FONT color="green">040</FONT>    import java.util.HashSet;<a name="line.40"></a>
<FONT color="green">041</FONT>    import java.util.Set;<a name="line.41"></a>
<FONT color="green">042</FONT>    <a name="line.42"></a>
<FONT color="green">043</FONT>    /**<a name="line.43"></a>
<FONT color="green">044</FONT>     * ManagedLegacyRepositoryContent<a name="line.44"></a>
<FONT color="green">045</FONT>     *<a name="line.45"></a>
<FONT color="green">046</FONT>     *<a name="line.46"></a>
<FONT color="green">047</FONT>     * @todo no need to be a component when filetypes, legacy path parser is not<a name="line.47"></a>
<FONT color="green">048</FONT>     */<a name="line.48"></a>
<FONT color="green">049</FONT>    @Service( "managedRepositoryContent#legacy" )<a name="line.49"></a>
<FONT color="green">050</FONT>    @Scope( "prototype" )<a name="line.50"></a>
<FONT color="green">051</FONT>    public class ManagedLegacyRepositoryContent<a name="line.51"></a>
<FONT color="green">052</FONT>        extends AbstractLegacyRepositoryContent<a name="line.52"></a>
<FONT color="green">053</FONT>        implements ManagedRepositoryContent<a name="line.53"></a>
<FONT color="green">054</FONT>    {<a name="line.54"></a>
<FONT color="green">055</FONT>        /**<a name="line.55"></a>
<FONT color="green">056</FONT>         *<a name="line.56"></a>
<FONT color="green">057</FONT>         */<a name="line.57"></a>
<FONT color="green">058</FONT>        @Inject<a name="line.58"></a>
<FONT color="green">059</FONT>        private FileTypes filetypes;<a name="line.59"></a>
<FONT color="green">060</FONT>    <a name="line.60"></a>
<FONT color="green">061</FONT>        private ManagedRepository repository;<a name="line.61"></a>
<FONT color="green">062</FONT>    <a name="line.62"></a>
<FONT color="green">063</FONT>        public void deleteVersion( VersionedReference reference )<a name="line.63"></a>
<FONT color="green">064</FONT>            throws ContentNotFoundException<a name="line.64"></a>
<FONT color="green">065</FONT>        {<a name="line.65"></a>
<FONT color="green">066</FONT>            File groupDir = new File( repository.getLocation(), reference.getGroupId() );<a name="line.66"></a>
<FONT color="green">067</FONT>    <a name="line.67"></a>
<FONT color="green">068</FONT>            if ( !groupDir.exists() )<a name="line.68"></a>
<FONT color="green">069</FONT>            {<a name="line.69"></a>
<FONT color="green">070</FONT>                throw new ContentNotFoundException(<a name="line.70"></a>
<FONT color="green">071</FONT>                    "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() );<a name="line.71"></a>
<FONT color="green">072</FONT>            }<a name="line.72"></a>
<FONT color="green">073</FONT>    <a name="line.73"></a>
<FONT color="green">074</FONT>            if ( !groupDir.isDirectory() )<a name="line.74"></a>
<FONT color="green">075</FONT>            {<a name="line.75"></a>
<FONT color="green">076</FONT>                throw new ContentNotFoundException(<a name="line.76"></a>
<FONT color="green">077</FONT>                    "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() );<a name="line.77"></a>
<FONT color="green">078</FONT>            }<a name="line.78"></a>
<FONT color="green">079</FONT>    <a name="line.79"></a>
<FONT color="green">080</FONT>            // First gather up the versions found as artifacts in the managed repository.<a name="line.80"></a>
<FONT color="green">081</FONT>            File typeDirs[] = groupDir.listFiles();<a name="line.81"></a>
<FONT color="green">082</FONT>            for ( File typeDir : typeDirs )<a name="line.82"></a>
<FONT color="green">083</FONT>            {<a name="line.83"></a>
<FONT color="green">084</FONT>                if ( !typeDir.isDirectory() )<a name="line.84"></a>
<FONT color="green">085</FONT>                {<a name="line.85"></a>
<FONT color="green">086</FONT>                    // Skip it, we only care about directories.<a name="line.86"></a>
<FONT color="green">087</FONT>                    continue;<a name="line.87"></a>
<FONT color="green">088</FONT>                }<a name="line.88"></a>
<FONT color="green">089</FONT>    <a name="line.89"></a>
<FONT color="green">090</FONT>                if ( !typeDir.getName().endsWith( "s" ) )<a name="line.90"></a>
<FONT color="green">091</FONT>                {<a name="line.91"></a>
<FONT color="green">092</FONT>                    // Skip it, we only care about directories that end in "s".<a name="line.92"></a>
<FONT color="green">093</FONT>                }<a name="line.93"></a>
<FONT color="green">094</FONT>    <a name="line.94"></a>
<FONT color="green">095</FONT>                deleteVersions( typeDir, reference );<a name="line.95"></a>
<FONT color="green">096</FONT>            }<a name="line.96"></a>
<FONT color="green">097</FONT>        }<a name="line.97"></a>
<FONT color="green">098</FONT>    <a name="line.98"></a>
<FONT color="green">099</FONT>        private void deleteVersions( File typeDir, VersionedReference reference )<a name="line.99"></a>
<FONT color="green">100</FONT>        {<a name="line.100"></a>
<FONT color="green">101</FONT>            File repoFiles[] = typeDir.listFiles();<a name="line.101"></a>
<FONT color="green">102</FONT>            for ( File repoFile : repoFiles )<a name="line.102"></a>
<FONT color="green">103</FONT>            {<a name="line.103"></a>
<FONT color="green">104</FONT>                if ( repoFile.isDirectory() )<a name="line.104"></a>
<FONT color="green">105</FONT>                {<a name="line.105"></a>
<FONT color="green">106</FONT>                    // Skip it. it's a directory.<a name="line.106"></a>
<FONT color="green">107</FONT>                    continue;<a name="line.107"></a>
<FONT color="green">108</FONT>                }<a name="line.108"></a>
<FONT color="green">109</FONT>    <a name="line.109"></a>
<FONT color="green">110</FONT>                String relativePath = PathUtil.getRelative( repository.getLocation(), repoFile );<a name="line.110"></a>
<FONT color="green">111</FONT>    <a name="line.111"></a>
<FONT color="green">112</FONT>                if ( filetypes.matchesArtifactPattern( relativePath ) )<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>                        ArtifactReference artifact = toArtifactReference( relativePath );<a name="line.116"></a>
<FONT color="green">117</FONT>                        if ( StringUtils.equals( artifact.getArtifactId(), reference.getArtifactId() )<a name="line.117"></a>
<FONT color="green">118</FONT>                            &amp;&amp; StringUtils.equals( artifact.getVersion(), reference.getVersion() ) )<a name="line.118"></a>
<FONT color="green">119</FONT>                        {<a name="line.119"></a>
<FONT color="green">120</FONT>                            repoFile.delete();<a name="line.120"></a>
<FONT color="green">121</FONT>                            deleteSupportFiles( repoFile );<a name="line.121"></a>
<FONT color="green">122</FONT>                        }<a name="line.122"></a>
<FONT color="green">123</FONT>                    }<a name="line.123"></a>
<FONT color="green">124</FONT>                    catch ( LayoutException e )<a name="line.124"></a>
<FONT color="green">125</FONT>                    {<a name="line.125"></a>
<FONT color="green">126</FONT>                        /* don't fail the process if there is a bad artifact within the directory. */<a name="line.126"></a>
<FONT color="green">127</FONT>                    }<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>        public void deleteProject( String namespace, String projectId )<a name="line.132"></a>
<FONT color="green">133</FONT>            throws RepositoryException<a name="line.133"></a>
<FONT color="green">134</FONT>        {<a name="line.134"></a>
<FONT color="green">135</FONT>            // TODO implements ??<a name="line.135"></a>
<FONT color="green">136</FONT>        }<a name="line.136"></a>
<FONT color="green">137</FONT>    <a name="line.137"></a>
<FONT color="green">138</FONT>        private void deleteSupportFiles( File repoFile )<a name="line.138"></a>
<FONT color="green">139</FONT>        {<a name="line.139"></a>
<FONT color="green">140</FONT>            deleteSupportFile( repoFile, ".sha1" );<a name="line.140"></a>
<FONT color="green">141</FONT>            deleteSupportFile( repoFile, ".md5" );<a name="line.141"></a>
<FONT color="green">142</FONT>            deleteSupportFile( repoFile, ".asc" );<a name="line.142"></a>
<FONT color="green">143</FONT>            deleteSupportFile( repoFile, ".gpg" );<a name="line.143"></a>
<FONT color="green">144</FONT>        }<a name="line.144"></a>
<FONT color="green">145</FONT>    <a name="line.145"></a>
<FONT color="green">146</FONT>        private void deleteSupportFile( File repoFile, String supportExtension )<a name="line.146"></a>
<FONT color="green">147</FONT>        {<a name="line.147"></a>
<FONT color="green">148</FONT>            File supportFile = new File( repoFile.getAbsolutePath() + supportExtension );<a name="line.148"></a>
<FONT color="green">149</FONT>            if ( supportFile.exists() &amp;&amp; supportFile.isFile() )<a name="line.149"></a>
<FONT color="green">150</FONT>            {<a name="line.150"></a>
<FONT color="green">151</FONT>                supportFile.delete();<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>    <a name="line.154"></a>
<FONT color="green">155</FONT>        public String getId()<a name="line.155"></a>
<FONT color="green">156</FONT>        {<a name="line.156"></a>
<FONT color="green">157</FONT>            return repository.getId();<a name="line.157"></a>
<FONT color="green">158</FONT>        }<a name="line.158"></a>
<FONT color="green">159</FONT>    <a name="line.159"></a>
<FONT color="green">160</FONT>        public Set&lt;ArtifactReference&gt; getRelatedArtifacts( ArtifactReference reference )<a name="line.160"></a>
<FONT color="green">161</FONT>            throws ContentNotFoundException<a name="line.161"></a>
<FONT color="green">162</FONT>        {<a name="line.162"></a>
<FONT color="green">163</FONT>            File artifactFile = toFile( reference );<a name="line.163"></a>
<FONT color="green">164</FONT>            File repoDir = artifactFile.getParentFile();<a name="line.164"></a>
<FONT color="green">165</FONT>    <a name="line.165"></a>
<FONT color="green">166</FONT>            if ( !repoDir.exists() )<a name="line.166"></a>
<FONT color="green">167</FONT>            {<a name="line.167"></a>
<FONT color="green">168</FONT>                throw new ContentNotFoundException(<a name="line.168"></a>
<FONT color="green">169</FONT>                    "Unable to get related artifacts using a non-existant directory: " + repoDir.getAbsolutePath() );<a name="line.169"></a>
<FONT color="green">170</FONT>            }<a name="line.170"></a>
<FONT color="green">171</FONT>    <a name="line.171"></a>
<FONT color="green">172</FONT>            if ( !repoDir.isDirectory() )<a name="line.172"></a>
<FONT color="green">173</FONT>            {<a name="line.173"></a>
<FONT color="green">174</FONT>                throw new ContentNotFoundException(<a name="line.174"></a>
<FONT color="green">175</FONT>                    "Unable to get related artifacts using a non-directory: " + repoDir.getAbsolutePath() );<a name="line.175"></a>
<FONT color="green">176</FONT>            }<a name="line.176"></a>
<FONT color="green">177</FONT>    <a name="line.177"></a>
<FONT color="green">178</FONT>            Set&lt;ArtifactReference&gt; foundArtifacts = new HashSet&lt;ArtifactReference&gt;();<a name="line.178"></a>
<FONT color="green">179</FONT>    <a name="line.179"></a>
<FONT color="green">180</FONT>            // First gather up the versions found as artifacts in the managed repository.<a name="line.180"></a>
<FONT color="green">181</FONT>            File projectParentDir = repoDir.getParentFile();<a name="line.181"></a>
<FONT color="green">182</FONT>            File typeDirs[] = projectParentDir.listFiles();<a name="line.182"></a>
<FONT color="green">183</FONT>            for ( File typeDir : typeDirs )<a name="line.183"></a>
<FONT color="green">184</FONT>            {<a name="line.184"></a>
<FONT color="green">185</FONT>                if ( !typeDir.isDirectory() )<a name="line.185"></a>
<FONT color="green">186</FONT>                {<a name="line.186"></a>
<FONT color="green">187</FONT>                    // Skip it, we only care about directories.<a name="line.187"></a>
<FONT color="green">188</FONT>                    continue;<a name="line.188"></a>
<FONT color="green">189</FONT>                }<a name="line.189"></a>
<FONT color="green">190</FONT>    <a name="line.190"></a>
<FONT color="green">191</FONT>                if ( !typeDir.getName().endsWith( "s" ) )<a name="line.191"></a>
<FONT color="green">192</FONT>                {<a name="line.192"></a>
<FONT color="green">193</FONT>                    // Skip it, we only care about directories that end in "s".<a name="line.193"></a>
<FONT color="green">194</FONT>                }<a name="line.194"></a>
<FONT color="green">195</FONT>    <a name="line.195"></a>
<FONT color="green">196</FONT>                getRelatedArtifacts( typeDir, reference, foundArtifacts );<a name="line.196"></a>
<FONT color="green">197</FONT>            }<a name="line.197"></a>
<FONT color="green">198</FONT>    <a name="line.198"></a>
<FONT color="green">199</FONT>            return foundArtifacts;<a name="line.199"></a>
<FONT color="green">200</FONT>        }<a name="line.200"></a>
<FONT color="green">201</FONT>    <a name="line.201"></a>
<FONT color="green">202</FONT>        public String getRepoRoot()<a name="line.202"></a>
<FONT color="green">203</FONT>        {<a name="line.203"></a>
<FONT color="green">204</FONT>            return repository.getLocation();<a name="line.204"></a>
<FONT color="green">205</FONT>        }<a name="line.205"></a>
<FONT color="green">206</FONT>    <a name="line.206"></a>
<FONT color="green">207</FONT>        public ManagedRepository getRepository()<a name="line.207"></a>
<FONT color="green">208</FONT>        {<a name="line.208"></a>
<FONT color="green">209</FONT>            return repository;<a name="line.209"></a>
<FONT color="green">210</FONT>        }<a name="line.210"></a>
<FONT color="green">211</FONT>    <a name="line.211"></a>
<FONT color="green">212</FONT>        public Set&lt;String&gt; getVersions( ProjectReference reference )<a name="line.212"></a>
<FONT color="green">213</FONT>            throws ContentNotFoundException<a name="line.213"></a>
<FONT color="green">214</FONT>        {<a name="line.214"></a>
<FONT color="green">215</FONT>            File groupDir = new File( repository.getLocation(), reference.getGroupId() );<a name="line.215"></a>
<FONT color="green">216</FONT>    <a name="line.216"></a>
<FONT color="green">217</FONT>            if ( !groupDir.exists() )<a name="line.217"></a>
<FONT color="green">218</FONT>            {<a name="line.218"></a>
<FONT color="green">219</FONT>                throw new ContentNotFoundException(<a name="line.219"></a>
<FONT color="green">220</FONT>                    "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() );<a name="line.220"></a>
<FONT color="green">221</FONT>            }<a name="line.221"></a>
<FONT color="green">222</FONT>    <a name="line.222"></a>
<FONT color="green">223</FONT>            if ( !groupDir.isDirectory() )<a name="line.223"></a>
<FONT color="green">224</FONT>            {<a name="line.224"></a>
<FONT color="green">225</FONT>                throw new ContentNotFoundException(<a name="line.225"></a>
<FONT color="green">226</FONT>                    "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() );<a name="line.226"></a>
<FONT color="green">227</FONT>            }<a name="line.227"></a>
<FONT color="green">228</FONT>    <a name="line.228"></a>
<FONT color="green">229</FONT>            Set&lt;String&gt; foundVersions = new HashSet&lt;String&gt;();<a name="line.229"></a>
<FONT color="green">230</FONT>    <a name="line.230"></a>
<FONT color="green">231</FONT>            // First gather up the versions found as artifacts in the managed repository.<a name="line.231"></a>
<FONT color="green">232</FONT>            File typeDirs[] = groupDir.listFiles();<a name="line.232"></a>
<FONT color="green">233</FONT>            for ( File typeDir : typeDirs )<a name="line.233"></a>
<FONT color="green">234</FONT>            {<a name="line.234"></a>
<FONT color="green">235</FONT>                if ( !typeDir.isDirectory() )<a name="line.235"></a>
<FONT color="green">236</FONT>                {<a name="line.236"></a>
<FONT color="green">237</FONT>                    // Skip it, we only care about directories.<a name="line.237"></a>
<FONT color="green">238</FONT>                    continue;<a name="line.238"></a>
<FONT color="green">239</FONT>                }<a name="line.239"></a>
<FONT color="green">240</FONT>    <a name="line.240"></a>
<FONT color="green">241</FONT>                if ( !typeDir.getName().endsWith( "s" ) )<a name="line.241"></a>
<FONT color="green">242</FONT>                {<a name="line.242"></a>
<FONT color="green">243</FONT>                    // Skip it, we only care about directories that end in "s".<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>                getProjectVersions( typeDir, reference, foundVersions );<a name="line.246"></a>
<FONT color="green">247</FONT>            }<a name="line.247"></a>
<FONT color="green">248</FONT>    <a name="line.248"></a>
<FONT color="green">249</FONT>            return foundVersions;<a name="line.249"></a>
<FONT color="green">250</FONT>        }<a name="line.250"></a>
<FONT color="green">251</FONT>    <a name="line.251"></a>
<FONT color="green">252</FONT>        public Set&lt;String&gt; getVersions( VersionedReference reference )<a name="line.252"></a>
<FONT color="green">253</FONT>            throws ContentNotFoundException<a name="line.253"></a>
<FONT color="green">254</FONT>        {<a name="line.254"></a>
<FONT color="green">255</FONT>            File groupDir = new File( repository.getLocation(), reference.getGroupId() );<a name="line.255"></a>
<FONT color="green">256</FONT>    <a name="line.256"></a>
<FONT color="green">257</FONT>            if ( !groupDir.exists() )<a name="line.257"></a>
<FONT color="green">258</FONT>            {<a name="line.258"></a>
<FONT color="green">259</FONT>                throw new ContentNotFoundException(<a name="line.259"></a>
<FONT color="green">260</FONT>                    "Unable to get versions using a non-existant groupId directory: " + groupDir.getAbsolutePath() );<a name="line.260"></a>
<FONT color="green">261</FONT>            }<a name="line.261"></a>
<FONT color="green">262</FONT>    <a name="line.262"></a>
<FONT color="green">263</FONT>            if ( !groupDir.isDirectory() )<a name="line.263"></a>
<FONT color="green">264</FONT>            {<a name="line.264"></a>
<FONT color="green">265</FONT>                throw new ContentNotFoundException(<a name="line.265"></a>
<FONT color="green">266</FONT>                    "Unable to get versions using a non-directory: " + groupDir.getAbsolutePath() );<a name="line.266"></a>
<FONT color="green">267</FONT>            }<a name="line.267"></a>
<FONT color="green">268</FONT>    <a name="line.268"></a>
<FONT color="green">269</FONT>            Set&lt;String&gt; foundVersions = new HashSet&lt;String&gt;();<a name="line.269"></a>
<FONT color="green">270</FONT>    <a name="line.270"></a>
<FONT color="green">271</FONT>            // First gather up the versions found as artifacts in the managed repository.<a name="line.271"></a>
<FONT color="green">272</FONT>            File typeDirs[] = groupDir.listFiles();<a name="line.272"></a>
<FONT color="green">273</FONT>            for ( File typeDir : typeDirs )<a name="line.273"></a>
<FONT color="green">274</FONT>            {<a name="line.274"></a>
<FONT color="green">275</FONT>                if ( !typeDir.isDirectory() )<a name="line.275"></a>
<FONT color="green">276</FONT>                {<a name="line.276"></a>
<FONT color="green">277</FONT>                    // Skip it, we only care about directories.<a name="line.277"></a>
<FONT color="green">278</FONT>                    continue;<a name="line.278"></a>
<FONT color="green">279</FONT>                }<a name="line.279"></a>
<FONT color="green">280</FONT>    <a name="line.280"></a>
<FONT color="green">281</FONT>                if ( !typeDir.getName().endsWith( "s" ) )<a name="line.281"></a>
<FONT color="green">282</FONT>                {<a name="line.282"></a>
<FONT color="green">283</FONT>                    // Skip it, we only care about directories that end in "s".<a name="line.283"></a>
<FONT color="green">284</FONT>                }<a name="line.284"></a>
<FONT color="green">285</FONT>    <a name="line.285"></a>
<FONT color="green">286</FONT>                getVersionedVersions( typeDir, reference, foundVersions );<a name="line.286"></a>
<FONT color="green">287</FONT>            }<a name="line.287"></a>
<FONT color="green">288</FONT>    <a name="line.288"></a>
<FONT color="green">289</FONT>            return foundVersions;<a name="line.289"></a>
<FONT color="green">290</FONT>        }<a name="line.290"></a>
<FONT color="green">291</FONT>    <a name="line.291"></a>
<FONT color="green">292</FONT>        public boolean hasContent( ArtifactReference reference )<a name="line.292"></a>
<FONT color="green">293</FONT>        {<a name="line.293"></a>
<FONT color="green">294</FONT>            File artifactFile = toFile( reference );<a name="line.294"></a>
<FONT color="green">295</FONT>            return artifactFile.exists() &amp;&amp; artifactFile.isFile();<a name="line.295"></a>
<FONT color="green">296</FONT>        }<a name="line.296"></a>
<FONT color="green">297</FONT>    <a name="line.297"></a>
<FONT color="green">298</FONT>        public boolean hasContent( ProjectReference reference )<a name="line.298"></a>
<FONT color="green">299</FONT>        {<a name="line.299"></a>
<FONT color="green">300</FONT>            try<a name="line.300"></a>
<FONT color="green">301</FONT>            {<a name="line.301"></a>
<FONT color="green">302</FONT>                Set&lt;String&gt; versions = getVersions( reference );<a name="line.302"></a>
<FONT color="green">303</FONT>                return CollectionUtils.isNotEmpty( versions );<a name="line.303"></a>
<FONT color="green">304</FONT>            }<a name="line.304"></a>
<FONT color="green">305</FONT>            catch ( ContentNotFoundException e )<a name="line.305"></a>
<FONT color="green">306</FONT>            {<a name="line.306"></a>
<FONT color="green">307</FONT>                return false;<a name="line.307"></a>
<FONT color="green">308</FONT>            }<a name="line.308"></a>
<FONT color="green">309</FONT>        }<a name="line.309"></a>
<FONT color="green">310</FONT>    <a name="line.310"></a>
<FONT color="green">311</FONT>        public boolean hasContent( VersionedReference reference )<a name="line.311"></a>
<FONT color="green">312</FONT>        {<a name="line.312"></a>
<FONT color="green">313</FONT>            try<a name="line.313"></a>
<FONT color="green">314</FONT>            {<a name="line.314"></a>
<FONT color="green">315</FONT>                Set&lt;String&gt; versions = getVersions( reference );<a name="line.315"></a>
<FONT color="green">316</FONT>                return CollectionUtils.isNotEmpty( versions );<a name="line.316"></a>
<FONT color="green">317</FONT>            }<a name="line.317"></a>
<FONT color="green">318</FONT>            catch ( ContentNotFoundException e )<a name="line.318"></a>
<FONT color="green">319</FONT>            {<a name="line.319"></a>
<FONT color="green">320</FONT>                return false;<a name="line.320"></a>
<FONT color="green">321</FONT>            }<a name="line.321"></a>
<FONT color="green">322</FONT>        }<a name="line.322"></a>
<FONT color="green">323</FONT>    <a name="line.323"></a>
<FONT color="green">324</FONT>        public void setRepository( ManagedRepository repository )<a name="line.324"></a>
<FONT color="green">325</FONT>        {<a name="line.325"></a>
<FONT color="green">326</FONT>            this.repository = repository;<a name="line.326"></a>
<FONT color="green">327</FONT>        }<a name="line.327"></a>
<FONT color="green">328</FONT>    <a name="line.328"></a>
<FONT color="green">329</FONT>        /**<a name="line.329"></a>
<FONT color="green">330</FONT>         * Convert a path to an artifact reference.<a name="line.330"></a>
<FONT color="green">331</FONT>         *<a name="line.331"></a>
<FONT color="green">332</FONT>         * @param path the path to convert. (relative or full location path)<a name="line.332"></a>
<FONT color="green">333</FONT>         * @throws org.apache.archiva.repository.layout.LayoutException if the path cannot be converted to an artifact reference.<a name="line.333"></a>
<FONT color="green">334</FONT>         */<a name="line.334"></a>
<FONT color="green">335</FONT>        @Override<a name="line.335"></a>
<FONT color="green">336</FONT>        public ArtifactReference toArtifactReference( String path )<a name="line.336"></a>
<FONT color="green">337</FONT>            throws LayoutException<a name="line.337"></a>
<FONT color="green">338</FONT>        {<a name="line.338"></a>
<FONT color="green">339</FONT>            if ( ( path != null ) &amp;&amp; path.startsWith( repository.getLocation() ) )<a name="line.339"></a>
<FONT color="green">340</FONT>            {<a name="line.340"></a>
<FONT color="green">341</FONT>                return super.toArtifactReference( path.substring( repository.getLocation().length() ) );<a name="line.341"></a>
<FONT color="green">342</FONT>            }<a name="line.342"></a>
<FONT color="green">343</FONT>    <a name="line.343"></a>
<FONT color="green">344</FONT>            return super.toArtifactReference( path );<a name="line.344"></a>
<FONT color="green">345</FONT>        }<a name="line.345"></a>
<FONT color="green">346</FONT>    <a name="line.346"></a>
<FONT color="green">347</FONT>        public File toFile( ArchivaArtifact reference )<a name="line.347"></a>
<FONT color="green">348</FONT>        {<a name="line.348"></a>
<FONT color="green">349</FONT>            return new File( repository.getLocation(), toPath( reference ) );<a name="line.349"></a>
<FONT color="green">350</FONT>        }<a name="line.350"></a>
<FONT color="green">351</FONT>    <a name="line.351"></a>
<FONT color="green">352</FONT>        public File toFile( ArtifactReference reference )<a name="line.352"></a>
<FONT color="green">353</FONT>        {<a name="line.353"></a>
<FONT color="green">354</FONT>            return new File( repository.getLocation(), toPath( reference ) );<a name="line.354"></a>
<FONT color="green">355</FONT>        }<a name="line.355"></a>
<FONT color="green">356</FONT>    <a name="line.356"></a>
<FONT color="green">357</FONT>        public String toMetadataPath( ProjectReference reference )<a name="line.357"></a>
<FONT color="green">358</FONT>        {<a name="line.358"></a>
<FONT color="green">359</FONT>            // No metadata present in legacy repository.<a name="line.359"></a>
<FONT color="green">360</FONT>            return null;<a name="line.360"></a>
<FONT color="green">361</FONT>        }<a name="line.361"></a>
<FONT color="green">362</FONT>    <a name="line.362"></a>
<FONT color="green">363</FONT>        public String toMetadataPath( VersionedReference reference )<a name="line.363"></a>
<FONT color="green">364</FONT>        {<a name="line.364"></a>
<FONT color="green">365</FONT>            // No metadata present in legacy repository.<a name="line.365"></a>
<FONT color="green">366</FONT>            return null;<a name="line.366"></a>
<FONT color="green">367</FONT>        }<a name="line.367"></a>
<FONT color="green">368</FONT>    <a name="line.368"></a>
<FONT color="green">369</FONT>        private void getProjectVersions( File typeDir, ProjectReference reference, Set&lt;String&gt; foundVersions )<a name="line.369"></a>
<FONT color="green">370</FONT>        {<a name="line.370"></a>
<FONT color="green">371</FONT>            File repoFiles[] = typeDir.listFiles();<a name="line.371"></a>
<FONT color="green">372</FONT>            for ( File repoFile : repoFiles )<a name="line.372"></a>
<FONT color="green">373</FONT>            {<a name="line.373"></a>
<FONT color="green">374</FONT>                if ( repoFile.isDirectory() )<a name="line.374"></a>
<FONT color="green">375</FONT>                {<a name="line.375"></a>
<FONT color="green">376</FONT>                    // Skip it. it's a directory.<a name="line.376"></a>
<FONT color="green">377</FONT>                    continue;<a name="line.377"></a>
<FONT color="green">378</FONT>                }<a name="line.378"></a>
<FONT color="green">379</FONT>    <a name="line.379"></a>
<FONT color="green">380</FONT>                String relativePath = PathUtil.getRelative( repository.getLocation(), repoFile );<a name="line.380"></a>
<FONT color="green">381</FONT>    <a name="line.381"></a>
<FONT color="green">382</FONT>                if ( filetypes.matchesArtifactPattern( relativePath ) )<a name="line.382"></a>
<FONT color="green">383</FONT>                {<a name="line.383"></a>
<FONT color="green">384</FONT>                    try<a name="line.384"></a>
<FONT color="green">385</FONT>                    {<a name="line.385"></a>
<FONT color="green">386</FONT>                        ArtifactReference artifact = toArtifactReference( relativePath );<a name="line.386"></a>
<FONT color="green">387</FONT>                        if ( StringUtils.equals( artifact.getArtifactId(), reference.getArtifactId() ) )<a name="line.387"></a>
<FONT color="green">388</FONT>                        {<a name="line.388"></a>
<FONT color="green">389</FONT>                            foundVersions.add( artifact.getVersion() );<a name="line.389"></a>
<FONT color="green">390</FONT>                        }<a name="line.390"></a>
<FONT color="green">391</FONT>                    }<a name="line.391"></a>
<FONT color="green">392</FONT>                    catch ( LayoutException e )<a name="line.392"></a>
<FONT color="green">393</FONT>                    {<a name="line.393"></a>
<FONT color="green">394</FONT>                        /* don't fail the process if there is a bad artifact within the directory. */<a name="line.394"></a>
<FONT color="green">395</FONT>                    }<a name="line.395"></a>
<FONT color="green">396</FONT>                }<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>    <a name="line.399"></a>
<FONT color="green">400</FONT>        private void getRelatedArtifacts( File typeDir, ArtifactReference reference, Set&lt;ArtifactReference&gt; foundArtifacts )<a name="line.400"></a>
<FONT color="green">401</FONT>        {<a name="line.401"></a>
<FONT color="green">402</FONT>            File repoFiles[] = typeDir.listFiles();<a name="line.402"></a>
<FONT color="green">403</FONT>            for ( int i = 0; i &lt; repoFiles.length; i++ )<a name="line.403"></a>
<FONT color="green">404</FONT>            {<a name="line.404"></a>
<FONT color="green">405</FONT>                if ( repoFiles[i].isDirectory() )<a name="line.405"></a>
<FONT color="green">406</FONT>                {<a name="line.406"></a>
<FONT color="green">407</FONT>                    // Skip it. it's a directory.<a name="line.407"></a>
<FONT color="green">408</FONT>                    continue;<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>                String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] );<a name="line.411"></a>
<FONT color="green">412</FONT>    <a name="line.412"></a>
<FONT color="green">413</FONT>                if ( filetypes.matchesArtifactPattern( relativePath ) )<a name="line.413"></a>
<FONT color="green">414</FONT>                {<a name="line.414"></a>
<FONT color="green">415</FONT>                    try<a name="line.415"></a>
<FONT color="green">416</FONT>                    {<a name="line.416"></a>
<FONT color="green">417</FONT>                        ArtifactReference artifact = toArtifactReference( relativePath );<a name="line.417"></a>
<FONT color="green">418</FONT>                        if ( StringUtils.equals( artifact.getArtifactId(), reference.getArtifactId() )<a name="line.418"></a>
<FONT color="green">419</FONT>                            &amp;&amp; artifact.getVersion().startsWith( reference.getVersion() ) )<a name="line.419"></a>
<FONT color="green">420</FONT>                        {<a name="line.420"></a>
<FONT color="green">421</FONT>                            foundArtifacts.add( artifact );<a name="line.421"></a>
<FONT color="green">422</FONT>                        }<a name="line.422"></a>
<FONT color="green">423</FONT>                    }<a name="line.423"></a>
<FONT color="green">424</FONT>                    catch ( LayoutException e )<a name="line.424"></a>
<FONT color="green">425</FONT>                    {<a name="line.425"></a>
<FONT color="green">426</FONT>                        /* don't fail the process if there is a bad artifact within the directory. */<a name="line.426"></a>
<FONT color="green">427</FONT>                    }<a name="line.427"></a>
<FONT color="green">428</FONT>                }<a name="line.428"></a>
<FONT color="green">429</FONT>            }<a name="line.429"></a>
<FONT color="green">430</FONT>        }<a name="line.430"></a>
<FONT color="green">431</FONT>    <a name="line.431"></a>
<FONT color="green">432</FONT>        private void getVersionedVersions( File typeDir, VersionedReference reference, Set&lt;String&gt; foundVersions )<a name="line.432"></a>
<FONT color="green">433</FONT>        {<a name="line.433"></a>
<FONT color="green">434</FONT>            File repoFiles[] = typeDir.listFiles();<a name="line.434"></a>
<FONT color="green">435</FONT>            for ( int i = 0; i &lt; repoFiles.length; i++ )<a name="line.435"></a>
<FONT color="green">436</FONT>            {<a name="line.436"></a>
<FONT color="green">437</FONT>                if ( repoFiles[i].isDirectory() )<a name="line.437"></a>
<FONT color="green">438</FONT>                {<a name="line.438"></a>
<FONT color="green">439</FONT>                    // Skip it. it's a directory.<a name="line.439"></a>
<FONT color="green">440</FONT>                    continue;<a name="line.440"></a>
<FONT color="green">441</FONT>                }<a name="line.441"></a>
<FONT color="green">442</FONT>    <a name="line.442"></a>
<FONT color="green">443</FONT>                String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] );<a name="line.443"></a>
<FONT color="green">444</FONT>    <a name="line.444"></a>
<FONT color="green">445</FONT>                if ( filetypes.matchesArtifactPattern( relativePath ) )<a name="line.445"></a>
<FONT color="green">446</FONT>                {<a name="line.446"></a>
<FONT color="green">447</FONT>                    try<a name="line.447"></a>
<FONT color="green">448</FONT>                    {<a name="line.448"></a>
<FONT color="green">449</FONT>                        ArtifactReference artifact = toArtifactReference( relativePath );<a name="line.449"></a>
<FONT color="green">450</FONT>                        if ( StringUtils.equals( artifact.getArtifactId(), reference.getArtifactId() )<a name="line.450"></a>
<FONT color="green">451</FONT>                            &amp;&amp; artifact.getVersion().startsWith( reference.getVersion() ) )<a name="line.451"></a>
<FONT color="green">452</FONT>                        {<a name="line.452"></a>
<FONT color="green">453</FONT>                            foundVersions.add( artifact.getVersion() );<a name="line.453"></a>
<FONT color="green">454</FONT>                        }<a name="line.454"></a>
<FONT color="green">455</FONT>                    }<a name="line.455"></a>
<FONT color="green">456</FONT>                    catch ( LayoutException e )<a name="line.456"></a>
<FONT color="green">457</FONT>                    {<a name="line.457"></a>
<FONT color="green">458</FONT>                        /* don't fail the process if there is a bad artifact within the directory. */<a name="line.458"></a>
<FONT color="green">459</FONT>                    }<a name="line.459"></a>
<FONT color="green">460</FONT>                }<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>    <a name="line.463"></a>
<FONT color="green">464</FONT>        public void setFileTypes( FileTypes fileTypes )<a name="line.464"></a>
<FONT color="green">465</FONT>        {<a name="line.465"></a>
<FONT color="green">466</FONT>            this.filetypes = fileTypes;<a name="line.466"></a>
<FONT color="green">467</FONT>        }<a name="line.467"></a>
<FONT color="green">468</FONT>    <a name="line.468"></a>
<FONT color="green">469</FONT>        public void deleteArtifact( ArtifactReference artifactReference )<a name="line.469"></a>
<FONT color="green">470</FONT>            throws ContentNotFoundException<a name="line.470"></a>
<FONT color="green">471</FONT>        {<a name="line.471"></a>
<FONT color="green">472</FONT>            // TODO implements for legacy ??<a name="line.472"></a>
<FONT color="green">473</FONT>        }<a name="line.473"></a>
<FONT color="green">474</FONT>    <a name="line.474"></a>
<FONT color="green">475</FONT>        public void deleteGroupId( String groupId )<a name="line.475"></a>
<FONT color="green">476</FONT>            throws ContentNotFoundException<a name="line.476"></a>
<FONT color="green">477</FONT>        {<a name="line.477"></a>
<FONT color="green">478</FONT>            // TODO implements for legacy ??<a name="line.478"></a>
<FONT color="green">479</FONT>        }<a name="line.479"></a>
<FONT color="green">480</FONT>    }<a name="line.480"></a>




























































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