<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    package org.apache.archiva.repository.metadata;<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.checksum.ChecksumAlgorithm;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.archiva.checksum.ChecksummedFile;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.archiva.common.utils.PathUtil;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.archiva.common.utils.VersionComparator;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.archiva.common.utils.VersionUtil;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.archiva.configuration.ArchivaConfiguration;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.archiva.configuration.ConfigurationNames;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.archiva.configuration.FileTypes;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.archiva.configuration.ProxyConnectorConfiguration;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.archiva.maven2.metadata.MavenMetadataReader;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.archiva.model.ArchivaRepositoryMetadata;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.archiva.model.ArtifactReference;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.apache.archiva.model.Plugin;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.apache.archiva.model.ProjectReference;<a name="line.35"></a>
<FONT color="green">036</FONT>    import org.apache.archiva.model.SnapshotVersion;<a name="line.36"></a>
<FONT color="green">037</FONT>    import org.apache.archiva.model.VersionedReference;<a name="line.37"></a>
<FONT color="green">038</FONT>    import org.apache.archiva.redback.components.registry.Registry;<a name="line.38"></a>
<FONT color="green">039</FONT>    import org.apache.archiva.redback.components.registry.RegistryListener;<a name="line.39"></a>
<FONT color="green">040</FONT>    import org.apache.archiva.repository.ContentNotFoundException;<a name="line.40"></a>
<FONT color="green">041</FONT>    import org.apache.archiva.repository.ManagedRepositoryContent;<a name="line.41"></a>
<FONT color="green">042</FONT>    import org.apache.archiva.repository.RemoteRepositoryContent;<a name="line.42"></a>
<FONT color="green">043</FONT>    import org.apache.archiva.repository.layout.LayoutException;<a name="line.43"></a>
<FONT color="green">044</FONT>    import org.apache.archiva.xml.XMLException;<a name="line.44"></a>
<FONT color="green">045</FONT>    import org.apache.commons.collections.CollectionUtils;<a name="line.45"></a>
<FONT color="green">046</FONT>    import org.apache.commons.io.FileUtils;<a name="line.46"></a>
<FONT color="green">047</FONT>    import org.apache.commons.lang.StringUtils;<a name="line.47"></a>
<FONT color="green">048</FONT>    import org.apache.commons.lang.math.NumberUtils;<a name="line.48"></a>
<FONT color="green">049</FONT>    import org.apache.commons.lang.time.DateUtils;<a name="line.49"></a>
<FONT color="green">050</FONT>    import org.slf4j.Logger;<a name="line.50"></a>
<FONT color="green">051</FONT>    import org.slf4j.LoggerFactory;<a name="line.51"></a>
<FONT color="green">052</FONT>    import org.springframework.stereotype.Service;<a name="line.52"></a>
<FONT color="green">053</FONT>    <a name="line.53"></a>
<FONT color="green">054</FONT>    import javax.annotation.PostConstruct;<a name="line.54"></a>
<FONT color="green">055</FONT>    import javax.inject.Inject;<a name="line.55"></a>
<FONT color="green">056</FONT>    import javax.inject.Named;<a name="line.56"></a>
<FONT color="green">057</FONT>    import java.io.File;<a name="line.57"></a>
<FONT color="green">058</FONT>    import java.io.IOException;<a name="line.58"></a>
<FONT color="green">059</FONT>    import java.text.ParseException;<a name="line.59"></a>
<FONT color="green">060</FONT>    import java.text.SimpleDateFormat;<a name="line.60"></a>
<FONT color="green">061</FONT>    import java.util.ArrayList;<a name="line.61"></a>
<FONT color="green">062</FONT>    import java.util.Calendar;<a name="line.62"></a>
<FONT color="green">063</FONT>    import java.util.Collection;<a name="line.63"></a>
<FONT color="green">064</FONT>    import java.util.Collections;<a name="line.64"></a>
<FONT color="green">065</FONT>    import java.util.Date;<a name="line.65"></a>
<FONT color="green">066</FONT>    import java.util.HashMap;<a name="line.66"></a>
<FONT color="green">067</FONT>    import java.util.HashSet;<a name="line.67"></a>
<FONT color="green">068</FONT>    import java.util.Iterator;<a name="line.68"></a>
<FONT color="green">069</FONT>    import java.util.LinkedHashSet;<a name="line.69"></a>
<FONT color="green">070</FONT>    import java.util.List;<a name="line.70"></a>
<FONT color="green">071</FONT>    import java.util.Map;<a name="line.71"></a>
<FONT color="green">072</FONT>    import java.util.Set;<a name="line.72"></a>
<FONT color="green">073</FONT>    import java.util.regex.Matcher;<a name="line.73"></a>
<FONT color="green">074</FONT>    <a name="line.74"></a>
<FONT color="green">075</FONT>    /**<a name="line.75"></a>
<FONT color="green">076</FONT>     * MetadataTools<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>     */<a name="line.79"></a>
<FONT color="green">080</FONT>    @Service( "metadataTools#default" )<a name="line.80"></a>
<FONT color="green">081</FONT>    public class MetadataTools<a name="line.81"></a>
<FONT color="green">082</FONT>        implements RegistryListener<a name="line.82"></a>
<FONT color="green">083</FONT>    {<a name="line.83"></a>
<FONT color="green">084</FONT>        private Logger log = LoggerFactory.getLogger( getClass() );<a name="line.84"></a>
<FONT color="green">085</FONT>    <a name="line.85"></a>
<FONT color="green">086</FONT>        public static final String MAVEN_METADATA = "maven-metadata.xml";<a name="line.86"></a>
<FONT color="green">087</FONT>    <a name="line.87"></a>
<FONT color="green">088</FONT>        public static final String MAVEN_ARCHETYPE_CATALOG ="archetype-catalog.xml";<a name="line.88"></a>
<FONT color="green">089</FONT>    <a name="line.89"></a>
<FONT color="green">090</FONT>        private static final char PATH_SEPARATOR = '/';<a name="line.90"></a>
<FONT color="green">091</FONT>    <a name="line.91"></a>
<FONT color="green">092</FONT>        private static final char GROUP_SEPARATOR = '.';<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>         *<a name="line.95"></a>
<FONT color="green">096</FONT>         */<a name="line.96"></a>
<FONT color="green">097</FONT>        @Inject<a name="line.97"></a>
<FONT color="green">098</FONT>        @Named( value = "archivaConfiguration#default" )<a name="line.98"></a>
<FONT color="green">099</FONT>        private ArchivaConfiguration configuration;<a name="line.99"></a>
<FONT color="green">100</FONT>    <a name="line.100"></a>
<FONT color="green">101</FONT>        /**<a name="line.101"></a>
<FONT color="green">102</FONT>         *<a name="line.102"></a>
<FONT color="green">103</FONT>         */<a name="line.103"></a>
<FONT color="green">104</FONT>        @Inject<a name="line.104"></a>
<FONT color="green">105</FONT>        @Named( value = "fileTypes" )<a name="line.105"></a>
<FONT color="green">106</FONT>        private FileTypes filetypes;<a name="line.106"></a>
<FONT color="green">107</FONT>    <a name="line.107"></a>
<FONT color="green">108</FONT>        private ChecksumAlgorithm[] algorithms = new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 };<a name="line.108"></a>
<FONT color="green">109</FONT>    <a name="line.109"></a>
<FONT color="green">110</FONT>        private List&lt;String&gt; artifactPatterns;<a name="line.110"></a>
<FONT color="green">111</FONT>    <a name="line.111"></a>
<FONT color="green">112</FONT>        private Map&lt;String, Set&lt;String&gt;&gt; proxies;<a name="line.112"></a>
<FONT color="green">113</FONT>    <a name="line.113"></a>
<FONT color="green">114</FONT>        private static final char NUMS[] = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };<a name="line.114"></a>
<FONT color="green">115</FONT>    <a name="line.115"></a>
<FONT color="green">116</FONT>        private SimpleDateFormat lastUpdatedFormat;<a name="line.116"></a>
<FONT color="green">117</FONT>    <a name="line.117"></a>
<FONT color="green">118</FONT>        public MetadataTools()<a name="line.118"></a>
<FONT color="green">119</FONT>        {<a name="line.119"></a>
<FONT color="green">120</FONT>            lastUpdatedFormat = new SimpleDateFormat( "yyyyMMddHHmmss" );<a name="line.120"></a>
<FONT color="green">121</FONT>            lastUpdatedFormat.setTimeZone( DateUtils.UTC_TIME_ZONE );<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>        public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )<a name="line.124"></a>
<FONT color="green">125</FONT>        {<a name="line.125"></a>
<FONT color="green">126</FONT>            if ( ConfigurationNames.isProxyConnector( propertyName ) )<a name="line.126"></a>
<FONT color="green">127</FONT>            {<a name="line.127"></a>
<FONT color="green">128</FONT>                initConfigVariables();<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 beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )<a name="line.132"></a>
<FONT color="green">133</FONT>        {<a name="line.133"></a>
<FONT color="green">134</FONT>            /* nothing to do */<a name="line.134"></a>
<FONT color="green">135</FONT>        }<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>         * Gather the set of snapshot versions found in a particular versioned reference.<a name="line.138"></a>
<FONT color="green">139</FONT>         *<a name="line.139"></a>
<FONT color="green">140</FONT>         * @return the Set of snapshot artifact versions found.<a name="line.140"></a>
<FONT color="green">141</FONT>         * @throws LayoutException<a name="line.141"></a>
<FONT color="green">142</FONT>         * @throws ContentNotFoundException<a name="line.142"></a>
<FONT color="green">143</FONT>         */<a name="line.143"></a>
<FONT color="green">144</FONT>        public Set&lt;String&gt; gatherSnapshotVersions( ManagedRepositoryContent managedRepository,<a name="line.144"></a>
<FONT color="green">145</FONT>                                                   VersionedReference reference )<a name="line.145"></a>
<FONT color="green">146</FONT>            throws LayoutException, IOException, ContentNotFoundException<a name="line.146"></a>
<FONT color="green">147</FONT>        {<a name="line.147"></a>
<FONT color="green">148</FONT>            Set&lt;String&gt; foundVersions = managedRepository.getVersions( reference );<a name="line.148"></a>
<FONT color="green">149</FONT>    <a name="line.149"></a>
<FONT color="green">150</FONT>            // Next gather up the referenced 'latest' versions found in any proxied repositories<a name="line.150"></a>
<FONT color="green">151</FONT>            // maven-metadata-${proxyId}.xml files that may be present.<a name="line.151"></a>
<FONT color="green">152</FONT>    <a name="line.152"></a>
<FONT color="green">153</FONT>            // Does this repository have a set of remote proxied repositories?<a name="line.153"></a>
<FONT color="green">154</FONT>            Set&lt;String&gt; proxiedRepoIds = this.proxies.get( managedRepository.getId() );<a name="line.154"></a>
<FONT color="green">155</FONT>    <a name="line.155"></a>
<FONT color="green">156</FONT>            if ( CollectionUtils.isNotEmpty( proxiedRepoIds ) )<a name="line.156"></a>
<FONT color="green">157</FONT>            {<a name="line.157"></a>
<FONT color="green">158</FONT>                String baseVersion = VersionUtil.getBaseVersion( reference.getVersion() );<a name="line.158"></a>
<FONT color="green">159</FONT>                baseVersion = baseVersion.substring( 0, baseVersion.indexOf( VersionUtil.SNAPSHOT ) - 1 );<a name="line.159"></a>
<FONT color="green">160</FONT>    <a name="line.160"></a>
<FONT color="green">161</FONT>                // Add in the proxied repo version ids too.<a name="line.161"></a>
<FONT color="green">162</FONT>                Iterator&lt;String&gt; it = proxiedRepoIds.iterator();<a name="line.162"></a>
<FONT color="green">163</FONT>                while ( it.hasNext() )<a name="line.163"></a>
<FONT color="green">164</FONT>                {<a name="line.164"></a>
<FONT color="green">165</FONT>                    String proxyId = it.next();<a name="line.165"></a>
<FONT color="green">166</FONT>    <a name="line.166"></a>
<FONT color="green">167</FONT>                    ArchivaRepositoryMetadata proxyMetadata = readProxyMetadata( managedRepository, reference, proxyId );<a name="line.167"></a>
<FONT color="green">168</FONT>                    if ( proxyMetadata == null )<a name="line.168"></a>
<FONT color="green">169</FONT>                    {<a name="line.169"></a>
<FONT color="green">170</FONT>                        // There is no proxy metadata, skip it.<a name="line.170"></a>
<FONT color="green">171</FONT>                        continue;<a name="line.171"></a>
<FONT color="green">172</FONT>                    }<a name="line.172"></a>
<FONT color="green">173</FONT>    <a name="line.173"></a>
<FONT color="green">174</FONT>                    // Is there some snapshot info?<a name="line.174"></a>
<FONT color="green">175</FONT>                    SnapshotVersion snapshot = proxyMetadata.getSnapshotVersion();<a name="line.175"></a>
<FONT color="green">176</FONT>                    if ( snapshot != null )<a name="line.176"></a>
<FONT color="green">177</FONT>                    {<a name="line.177"></a>
<FONT color="green">178</FONT>                        String timestamp = snapshot.getTimestamp();<a name="line.178"></a>
<FONT color="green">179</FONT>                        int buildNumber = snapshot.getBuildNumber();<a name="line.179"></a>
<FONT color="green">180</FONT>    <a name="line.180"></a>
<FONT color="green">181</FONT>                        // Only interested in the timestamp + buildnumber.<a name="line.181"></a>
<FONT color="green">182</FONT>                        if ( StringUtils.isNotBlank( timestamp ) &amp;&amp; ( buildNumber &gt; 0 ) )<a name="line.182"></a>
<FONT color="green">183</FONT>                        {<a name="line.183"></a>
<FONT color="green">184</FONT>                            foundVersions.add( baseVersion + "-" + timestamp + "-" + buildNumber );<a name="line.184"></a>
<FONT color="green">185</FONT>                        }<a name="line.185"></a>
<FONT color="green">186</FONT>                    }<a name="line.186"></a>
<FONT color="green">187</FONT>                }<a name="line.187"></a>
<FONT color="green">188</FONT>            }<a name="line.188"></a>
<FONT color="green">189</FONT>    <a name="line.189"></a>
<FONT color="green">190</FONT>            return foundVersions;<a name="line.190"></a>
<FONT color="green">191</FONT>        }<a name="line.191"></a>
<FONT color="green">192</FONT>    <a name="line.192"></a>
<FONT color="green">193</FONT>        /**<a name="line.193"></a>
<FONT color="green">194</FONT>         * Take a path to a maven-metadata.xml, and attempt to translate it to a VersionedReference.<a name="line.194"></a>
<FONT color="green">195</FONT>         *<a name="line.195"></a>
<FONT color="green">196</FONT>         * @param path<a name="line.196"></a>
<FONT color="green">197</FONT>         * @return<a name="line.197"></a>
<FONT color="green">198</FONT>         */<a name="line.198"></a>
<FONT color="green">199</FONT>        public VersionedReference toVersionedReference( String path )<a name="line.199"></a>
<FONT color="green">200</FONT>            throws RepositoryMetadataException<a name="line.200"></a>
<FONT color="green">201</FONT>        {<a name="line.201"></a>
<FONT color="green">202</FONT>            if ( !path.endsWith( "/" + MAVEN_METADATA ) )<a name="line.202"></a>
<FONT color="green">203</FONT>            {<a name="line.203"></a>
<FONT color="green">204</FONT>                throw new RepositoryMetadataException( "Cannot convert to versioned reference, not a metadata file. " );<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>            VersionedReference reference = new VersionedReference();<a name="line.207"></a>
<FONT color="green">208</FONT>    <a name="line.208"></a>
<FONT color="green">209</FONT>            String normalizedPath = StringUtils.replace( path, "\\", "/" );<a name="line.209"></a>
<FONT color="green">210</FONT>            String pathParts[] = StringUtils.split( normalizedPath, '/' );<a name="line.210"></a>
<FONT color="green">211</FONT>    <a name="line.211"></a>
<FONT color="green">212</FONT>            int versionOffset = pathParts.length - 2;<a name="line.212"></a>
<FONT color="green">213</FONT>            int artifactIdOffset = versionOffset - 1;<a name="line.213"></a>
<FONT color="green">214</FONT>            int groupIdEnd = artifactIdOffset - 1;<a name="line.214"></a>
<FONT color="green">215</FONT>    <a name="line.215"></a>
<FONT color="green">216</FONT>            reference.setVersion( pathParts[versionOffset] );<a name="line.216"></a>
<FONT color="green">217</FONT>    <a name="line.217"></a>
<FONT color="green">218</FONT>            if ( !hasNumberAnywhere( reference.getVersion() ) )<a name="line.218"></a>
<FONT color="green">219</FONT>            {<a name="line.219"></a>
<FONT color="green">220</FONT>                // Scary check, but without it, all paths are version references;<a name="line.220"></a>
<FONT color="green">221</FONT>                throw new RepositoryMetadataException(<a name="line.221"></a>
<FONT color="green">222</FONT>                    "Not a versioned reference, as version id on path has no number in it." );<a name="line.222"></a>
<FONT color="green">223</FONT>            }<a name="line.223"></a>
<FONT color="green">224</FONT>    <a name="line.224"></a>
<FONT color="green">225</FONT>            reference.setArtifactId( pathParts[artifactIdOffset] );<a name="line.225"></a>
<FONT color="green">226</FONT>    <a name="line.226"></a>
<FONT color="green">227</FONT>            StringBuilder gid = new StringBuilder();<a name="line.227"></a>
<FONT color="green">228</FONT>            for ( int i = 0; i &lt;= groupIdEnd; i++ )<a name="line.228"></a>
<FONT color="green">229</FONT>            {<a name="line.229"></a>
<FONT color="green">230</FONT>                if ( i &gt; 0 )<a name="line.230"></a>
<FONT color="green">231</FONT>                {<a name="line.231"></a>
<FONT color="green">232</FONT>                    gid.append( "." );<a name="line.232"></a>
<FONT color="green">233</FONT>                }<a name="line.233"></a>
<FONT color="green">234</FONT>                gid.append( pathParts[i] );<a name="line.234"></a>
<FONT color="green">235</FONT>            }<a name="line.235"></a>
<FONT color="green">236</FONT>    <a name="line.236"></a>
<FONT color="green">237</FONT>            reference.setGroupId( gid.toString() );<a name="line.237"></a>
<FONT color="green">238</FONT>    <a name="line.238"></a>
<FONT color="green">239</FONT>            return reference;<a name="line.239"></a>
<FONT color="green">240</FONT>        }<a name="line.240"></a>
<FONT color="green">241</FONT>    <a name="line.241"></a>
<FONT color="green">242</FONT>        private boolean hasNumberAnywhere( String version )<a name="line.242"></a>
<FONT color="green">243</FONT>        {<a name="line.243"></a>
<FONT color="green">244</FONT>            return StringUtils.indexOfAny( version, NUMS ) != ( -1 );<a name="line.244"></a>
<FONT color="green">245</FONT>        }<a name="line.245"></a>
<FONT color="green">246</FONT>    <a name="line.246"></a>
<FONT color="green">247</FONT>        public ProjectReference toProjectReference( String path )<a name="line.247"></a>
<FONT color="green">248</FONT>            throws RepositoryMetadataException<a name="line.248"></a>
<FONT color="green">249</FONT>        {<a name="line.249"></a>
<FONT color="green">250</FONT>            if ( !path.endsWith( "/" + MAVEN_METADATA ) )<a name="line.250"></a>
<FONT color="green">251</FONT>            {<a name="line.251"></a>
<FONT color="green">252</FONT>                throw new RepositoryMetadataException( "Cannot convert to versioned reference, not a metadata file. " );<a name="line.252"></a>
<FONT color="green">253</FONT>            }<a name="line.253"></a>
<FONT color="green">254</FONT>    <a name="line.254"></a>
<FONT color="green">255</FONT>            ProjectReference reference = new ProjectReference();<a name="line.255"></a>
<FONT color="green">256</FONT>    <a name="line.256"></a>
<FONT color="green">257</FONT>            String normalizedPath = StringUtils.replace( path, "\\", "/" );<a name="line.257"></a>
<FONT color="green">258</FONT>            String pathParts[] = StringUtils.split( normalizedPath, '/' );<a name="line.258"></a>
<FONT color="green">259</FONT>    <a name="line.259"></a>
<FONT color="green">260</FONT>            // Assume last part of the path is the version.<a name="line.260"></a>
<FONT color="green">261</FONT>    <a name="line.261"></a>
<FONT color="green">262</FONT>            int artifactIdOffset = pathParts.length - 2;<a name="line.262"></a>
<FONT color="green">263</FONT>            int groupIdEnd = artifactIdOffset - 1;<a name="line.263"></a>
<FONT color="green">264</FONT>    <a name="line.264"></a>
<FONT color="green">265</FONT>            reference.setArtifactId( pathParts[artifactIdOffset] );<a name="line.265"></a>
<FONT color="green">266</FONT>    <a name="line.266"></a>
<FONT color="green">267</FONT>            StringBuilder gid = new StringBuilder();<a name="line.267"></a>
<FONT color="green">268</FONT>            for ( int i = 0; i &lt;= groupIdEnd; i++ )<a name="line.268"></a>
<FONT color="green">269</FONT>            {<a name="line.269"></a>
<FONT color="green">270</FONT>                if ( i &gt; 0 )<a name="line.270"></a>
<FONT color="green">271</FONT>                {<a name="line.271"></a>
<FONT color="green">272</FONT>                    gid.append( "." );<a name="line.272"></a>
<FONT color="green">273</FONT>                }<a name="line.273"></a>
<FONT color="green">274</FONT>                gid.append( pathParts[i] );<a name="line.274"></a>
<FONT color="green">275</FONT>            }<a name="line.275"></a>
<FONT color="green">276</FONT>    <a name="line.276"></a>
<FONT color="green">277</FONT>            reference.setGroupId( gid.toString() );<a name="line.277"></a>
<FONT color="green">278</FONT>    <a name="line.278"></a>
<FONT color="green">279</FONT>            return reference;<a name="line.279"></a>
<FONT color="green">280</FONT>        }<a name="line.280"></a>
<FONT color="green">281</FONT>    <a name="line.281"></a>
<FONT color="green">282</FONT>        public String toPath( ProjectReference reference )<a name="line.282"></a>
<FONT color="green">283</FONT>        {<a name="line.283"></a>
<FONT color="green">284</FONT>            StringBuilder path = new StringBuilder();<a name="line.284"></a>
<FONT color="green">285</FONT>    <a name="line.285"></a>
<FONT color="green">286</FONT>            path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );<a name="line.286"></a>
<FONT color="green">287</FONT>            path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );<a name="line.287"></a>
<FONT color="green">288</FONT>            path.append( MAVEN_METADATA );<a name="line.288"></a>
<FONT color="green">289</FONT>    <a name="line.289"></a>
<FONT color="green">290</FONT>            return path.toString();<a name="line.290"></a>
<FONT color="green">291</FONT>        }<a name="line.291"></a>
<FONT color="green">292</FONT>    <a name="line.292"></a>
<FONT color="green">293</FONT>        public String toPath( VersionedReference reference )<a name="line.293"></a>
<FONT color="green">294</FONT>        {<a name="line.294"></a>
<FONT color="green">295</FONT>            StringBuilder path = new StringBuilder();<a name="line.295"></a>
<FONT color="green">296</FONT>    <a name="line.296"></a>
<FONT color="green">297</FONT>            path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );<a name="line.297"></a>
<FONT color="green">298</FONT>            path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );<a name="line.298"></a>
<FONT color="green">299</FONT>            if ( reference.getVersion() != null )<a name="line.299"></a>
<FONT color="green">300</FONT>            {<a name="line.300"></a>
<FONT color="green">301</FONT>                // add the version only if it is present<a name="line.301"></a>
<FONT color="green">302</FONT>                path.append( VersionUtil.getBaseVersion( reference.getVersion() ) ).append( PATH_SEPARATOR );<a name="line.302"></a>
<FONT color="green">303</FONT>            }<a name="line.303"></a>
<FONT color="green">304</FONT>            path.append( MAVEN_METADATA );<a name="line.304"></a>
<FONT color="green">305</FONT>    <a name="line.305"></a>
<FONT color="green">306</FONT>            return path.toString();<a name="line.306"></a>
<FONT color="green">307</FONT>        }<a name="line.307"></a>
<FONT color="green">308</FONT>    <a name="line.308"></a>
<FONT color="green">309</FONT>        private String formatAsDirectory( String directory )<a name="line.309"></a>
<FONT color="green">310</FONT>        {<a name="line.310"></a>
<FONT color="green">311</FONT>            return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );<a name="line.311"></a>
<FONT color="green">312</FONT>        }<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>         * Adjusts a path for a metadata.xml file to its repository specific path.<a name="line.315"></a>
<FONT color="green">316</FONT>         *<a name="line.316"></a>
<FONT color="green">317</FONT>         * @param repository the repository to base new path off of.<a name="line.317"></a>
<FONT color="green">318</FONT>         * @param path       the path to the metadata.xml file to adjust the name of.<a name="line.318"></a>
<FONT color="green">319</FONT>         * @return the newly adjusted path reference to the repository specific metadata path.<a name="line.319"></a>
<FONT color="green">320</FONT>         */<a name="line.320"></a>
<FONT color="green">321</FONT>        public String getRepositorySpecificName( RemoteRepositoryContent repository, String path )<a name="line.321"></a>
<FONT color="green">322</FONT>        {<a name="line.322"></a>
<FONT color="green">323</FONT>            return getRepositorySpecificName( repository.getId(), path );<a name="line.323"></a>
<FONT color="green">324</FONT>        }<a name="line.324"></a>
<FONT color="green">325</FONT>    <a name="line.325"></a>
<FONT color="green">326</FONT>        /**<a name="line.326"></a>
<FONT color="green">327</FONT>         * Adjusts a path for a metadata.xml file to its repository specific path.<a name="line.327"></a>
<FONT color="green">328</FONT>         *<a name="line.328"></a>
<FONT color="green">329</FONT>         * @param proxyId the repository id to base new path off of.<a name="line.329"></a>
<FONT color="green">330</FONT>         * @param path    the path to the metadata.xml file to adjust the name of.<a name="line.330"></a>
<FONT color="green">331</FONT>         * @return the newly adjusted path reference to the repository specific metadata path.<a name="line.331"></a>
<FONT color="green">332</FONT>         */<a name="line.332"></a>
<FONT color="green">333</FONT>        public String getRepositorySpecificName( String proxyId, String path )<a name="line.333"></a>
<FONT color="green">334</FONT>        {<a name="line.334"></a>
<FONT color="green">335</FONT>            StringBuilder ret = new StringBuilder();<a name="line.335"></a>
<FONT color="green">336</FONT>    <a name="line.336"></a>
<FONT color="green">337</FONT>            int idx = path.lastIndexOf( '/' );<a name="line.337"></a>
<FONT color="green">338</FONT>            if ( idx &gt; 0 )<a name="line.338"></a>
<FONT color="green">339</FONT>            {<a name="line.339"></a>
<FONT color="green">340</FONT>                ret.append( path.substring( 0, idx + 1 ) );<a name="line.340"></a>
<FONT color="green">341</FONT>            }<a name="line.341"></a>
<FONT color="green">342</FONT>    <a name="line.342"></a>
<FONT color="green">343</FONT>            // TODO: need to filter out 'bad' characters from the proxy id.<a name="line.343"></a>
<FONT color="green">344</FONT>            ret.append( "maven-metadata-" ).append( proxyId ).append( ".xml" );<a name="line.344"></a>
<FONT color="green">345</FONT>    <a name="line.345"></a>
<FONT color="green">346</FONT>            return ret.toString();<a name="line.346"></a>
<FONT color="green">347</FONT>        }<a name="line.347"></a>
<FONT color="green">348</FONT>    <a name="line.348"></a>
<FONT color="green">349</FONT>        @PostConstruct<a name="line.349"></a>
<FONT color="green">350</FONT>        public void initialize()<a name="line.350"></a>
<FONT color="green">351</FONT>        {<a name="line.351"></a>
<FONT color="green">352</FONT>            this.artifactPatterns = new ArrayList&lt;String&gt;();<a name="line.352"></a>
<FONT color="green">353</FONT>            this.proxies = new HashMap&lt;String, Set&lt;String&gt;&gt;();<a name="line.353"></a>
<FONT color="green">354</FONT>            initConfigVariables();<a name="line.354"></a>
<FONT color="green">355</FONT>    <a name="line.355"></a>
<FONT color="green">356</FONT>            configuration.addChangeListener( this );<a name="line.356"></a>
<FONT color="green">357</FONT>        }<a name="line.357"></a>
<FONT color="green">358</FONT>    <a name="line.358"></a>
<FONT color="green">359</FONT>        public ArchivaRepositoryMetadata readProxyMetadata( ManagedRepositoryContent managedRepository,<a name="line.359"></a>
<FONT color="green">360</FONT>                                                            ProjectReference reference, String proxyId )<a name="line.360"></a>
<FONT color="green">361</FONT>        {<a name="line.361"></a>
<FONT color="green">362</FONT>            String metadataPath = getRepositorySpecificName( proxyId, toPath( reference ) );<a name="line.362"></a>
<FONT color="green">363</FONT>            File metadataFile = new File( managedRepository.getRepoRoot(), metadataPath );<a name="line.363"></a>
<FONT color="green">364</FONT>    <a name="line.364"></a>
<FONT color="green">365</FONT>            if ( !metadataFile.exists() || !metadataFile.isFile() )<a name="line.365"></a>
<FONT color="green">366</FONT>            {<a name="line.366"></a>
<FONT color="green">367</FONT>                // Nothing to do. return null.<a name="line.367"></a>
<FONT color="green">368</FONT>                return null;<a name="line.368"></a>
<FONT color="green">369</FONT>            }<a name="line.369"></a>
<FONT color="green">370</FONT>    <a name="line.370"></a>
<FONT color="green">371</FONT>            try<a name="line.371"></a>
<FONT color="green">372</FONT>            {<a name="line.372"></a>
<FONT color="green">373</FONT>                return MavenMetadataReader.read( metadataFile );<a name="line.373"></a>
<FONT color="green">374</FONT>            }<a name="line.374"></a>
<FONT color="green">375</FONT>            catch ( XMLException e )<a name="line.375"></a>
<FONT color="green">376</FONT>            {<a name="line.376"></a>
<FONT color="green">377</FONT>                // TODO: [monitor] consider a monitor for this event.<a name="line.377"></a>
<FONT color="green">378</FONT>                // TODO: consider a read-redo on monitor return code?<a name="line.378"></a>
<FONT color="green">379</FONT>                log.warn( "Unable to read metadata: " + metadataFile.getAbsolutePath(), e );<a name="line.379"></a>
<FONT color="green">380</FONT>                return null;<a name="line.380"></a>
<FONT color="green">381</FONT>            }<a name="line.381"></a>
<FONT color="green">382</FONT>        }<a name="line.382"></a>
<FONT color="green">383</FONT>    <a name="line.383"></a>
<FONT color="green">384</FONT>        public ArchivaRepositoryMetadata readProxyMetadata( ManagedRepositoryContent managedRepository,<a name="line.384"></a>
<FONT color="green">385</FONT>                                                            String logicalResource, String proxyId )<a name="line.385"></a>
<FONT color="green">386</FONT>        {<a name="line.386"></a>
<FONT color="green">387</FONT>            String metadataPath = getRepositorySpecificName( proxyId, logicalResource );<a name="line.387"></a>
<FONT color="green">388</FONT>            File metadataFile = new File( managedRepository.getRepoRoot(), metadataPath );<a name="line.388"></a>
<FONT color="green">389</FONT>    <a name="line.389"></a>
<FONT color="green">390</FONT>            if ( !metadataFile.exists() || !metadataFile.isFile() )<a name="line.390"></a>
<FONT color="green">391</FONT>            {<a name="line.391"></a>
<FONT color="green">392</FONT>                // Nothing to do. return null.<a name="line.392"></a>
<FONT color="green">393</FONT>                return null;<a name="line.393"></a>
<FONT color="green">394</FONT>            }<a name="line.394"></a>
<FONT color="green">395</FONT>    <a name="line.395"></a>
<FONT color="green">396</FONT>            try<a name="line.396"></a>
<FONT color="green">397</FONT>            {<a name="line.397"></a>
<FONT color="green">398</FONT>                return MavenMetadataReader.read( metadataFile );<a name="line.398"></a>
<FONT color="green">399</FONT>            }<a name="line.399"></a>
<FONT color="green">400</FONT>            catch ( XMLException e )<a name="line.400"></a>
<FONT color="green">401</FONT>            {<a name="line.401"></a>
<FONT color="green">402</FONT>                // TODO: [monitor] consider a monitor for this event.<a name="line.402"></a>
<FONT color="green">403</FONT>                // TODO: consider a read-redo on monitor return code?<a name="line.403"></a>
<FONT color="green">404</FONT>                log.warn( "Unable to read metadata: " + metadataFile.getAbsolutePath(), e );<a name="line.404"></a>
<FONT color="green">405</FONT>                return null;<a name="line.405"></a>
<FONT color="green">406</FONT>            }<a name="line.406"></a>
<FONT color="green">407</FONT>        }<a name="line.407"></a>
<FONT color="green">408</FONT>    <a name="line.408"></a>
<FONT color="green">409</FONT>        public ArchivaRepositoryMetadata readProxyMetadata( ManagedRepositoryContent managedRepository,<a name="line.409"></a>
<FONT color="green">410</FONT>                                                            VersionedReference reference, String proxyId )<a name="line.410"></a>
<FONT color="green">411</FONT>        {<a name="line.411"></a>
<FONT color="green">412</FONT>            String metadataPath = getRepositorySpecificName( proxyId, toPath( reference ) );<a name="line.412"></a>
<FONT color="green">413</FONT>            File metadataFile = new File( managedRepository.getRepoRoot(), metadataPath );<a name="line.413"></a>
<FONT color="green">414</FONT>    <a name="line.414"></a>
<FONT color="green">415</FONT>            if ( !metadataFile.exists() || !metadataFile.isFile() )<a name="line.415"></a>
<FONT color="green">416</FONT>            {<a name="line.416"></a>
<FONT color="green">417</FONT>                // Nothing to do. return null.<a name="line.417"></a>
<FONT color="green">418</FONT>                return null;<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>            try<a name="line.421"></a>
<FONT color="green">422</FONT>            {<a name="line.422"></a>
<FONT color="green">423</FONT>                return MavenMetadataReader.read( metadataFile );<a name="line.423"></a>
<FONT color="green">424</FONT>            }<a name="line.424"></a>
<FONT color="green">425</FONT>            catch ( XMLException e )<a name="line.425"></a>
<FONT color="green">426</FONT>            {<a name="line.426"></a>
<FONT color="green">427</FONT>                // TODO: [monitor] consider a monitor for this event.<a name="line.427"></a>
<FONT color="green">428</FONT>                // TODO: consider a read-redo on monitor return code?<a name="line.428"></a>
<FONT color="green">429</FONT>                log.warn( "Unable to read metadata: " + metadataFile.getAbsolutePath(), e );<a name="line.429"></a>
<FONT color="green">430</FONT>                return null;<a name="line.430"></a>
<FONT color="green">431</FONT>            }<a name="line.431"></a>
<FONT color="green">432</FONT>        }<a name="line.432"></a>
<FONT color="green">433</FONT>    <a name="line.433"></a>
<FONT color="green">434</FONT>        public void updateMetadata( ManagedRepositoryContent managedRepository, String logicalResource )<a name="line.434"></a>
<FONT color="green">435</FONT>            throws RepositoryMetadataException<a name="line.435"></a>
<FONT color="green">436</FONT>        {<a name="line.436"></a>
<FONT color="green">437</FONT>            final File metadataFile = new File( managedRepository.getRepoRoot(), logicalResource );<a name="line.437"></a>
<FONT color="green">438</FONT>            ArchivaRepositoryMetadata metadata = null;<a name="line.438"></a>
<FONT color="green">439</FONT>    <a name="line.439"></a>
<FONT color="green">440</FONT>            //Gather and merge all metadata available<a name="line.440"></a>
<FONT color="green">441</FONT>            List&lt;ArchivaRepositoryMetadata&gt; metadatas =<a name="line.441"></a>
<FONT color="green">442</FONT>                getMetadatasForManagedRepository( managedRepository, logicalResource );<a name="line.442"></a>
<FONT color="green">443</FONT>            for ( ArchivaRepositoryMetadata proxiedMetadata : metadatas )<a name="line.443"></a>
<FONT color="green">444</FONT>            {<a name="line.444"></a>
<FONT color="green">445</FONT>                if ( metadata == null )<a name="line.445"></a>
<FONT color="green">446</FONT>                {<a name="line.446"></a>
<FONT color="green">447</FONT>                    metadata = proxiedMetadata;<a name="line.447"></a>
<FONT color="green">448</FONT>                    continue;<a name="line.448"></a>
<FONT color="green">449</FONT>                }<a name="line.449"></a>
<FONT color="green">450</FONT>                metadata = RepositoryMetadataMerge.merge( metadata, proxiedMetadata );<a name="line.450"></a>
<FONT color="green">451</FONT>            }<a name="line.451"></a>
<FONT color="green">452</FONT>    <a name="line.452"></a>
<FONT color="green">453</FONT>            if ( metadata == null )<a name="line.453"></a>
<FONT color="green">454</FONT>            {<a name="line.454"></a>
<FONT color="green">455</FONT>                log.debug( "No metadata to update for {}", logicalResource );<a name="line.455"></a>
<FONT color="green">456</FONT>                return;<a name="line.456"></a>
<FONT color="green">457</FONT>            }<a name="line.457"></a>
<FONT color="green">458</FONT>    <a name="line.458"></a>
<FONT color="green">459</FONT>            Set&lt;String&gt; availableVersions = new HashSet&lt;String&gt;();<a name="line.459"></a>
<FONT color="green">460</FONT>            List&lt;String&gt; metadataAvailableVersions = metadata.getAvailableVersions();<a name="line.460"></a>
<FONT color="green">461</FONT>            if ( metadataAvailableVersions != null )<a name="line.461"></a>
<FONT color="green">462</FONT>            {<a name="line.462"></a>
<FONT color="green">463</FONT>                availableVersions.addAll( metadataAvailableVersions );<a name="line.463"></a>
<FONT color="green">464</FONT>            }<a name="line.464"></a>
<FONT color="green">465</FONT>            availableVersions = findPossibleVersions( availableVersions, metadataFile.getParentFile() );<a name="line.465"></a>
<FONT color="green">466</FONT>    <a name="line.466"></a>
<FONT color="green">467</FONT>            if ( availableVersions.size() &gt; 0 )<a name="line.467"></a>
<FONT color="green">468</FONT>            {<a name="line.468"></a>
<FONT color="green">469</FONT>                updateMetadataVersions( availableVersions, metadata );<a name="line.469"></a>
<FONT color="green">470</FONT>            }<a name="line.470"></a>
<FONT color="green">471</FONT>    <a name="line.471"></a>
<FONT color="green">472</FONT>            RepositoryMetadataWriter.write( metadata, metadataFile );<a name="line.472"></a>
<FONT color="green">473</FONT>    <a name="line.473"></a>
<FONT color="green">474</FONT>            ChecksummedFile checksum = new ChecksummedFile( metadataFile );<a name="line.474"></a>
<FONT color="green">475</FONT>            checksum.fixChecksums( algorithms );<a name="line.475"></a>
<FONT color="green">476</FONT>        }<a name="line.476"></a>
<FONT color="green">477</FONT>    <a name="line.477"></a>
<FONT color="green">478</FONT>        /**<a name="line.478"></a>
<FONT color="green">479</FONT>         * Skims the parent directory of a metadata in vain hope of finding<a name="line.479"></a>
<FONT color="green">480</FONT>         * subdirectories that contain poms.<a name="line.480"></a>
<FONT color="green">481</FONT>         *<a name="line.481"></a>
<FONT color="green">482</FONT>         * @param metadataParentDirectory<a name="line.482"></a>
<FONT color="green">483</FONT>         * @return origional set plus newley found versions<a name="line.483"></a>
<FONT color="green">484</FONT>         */<a name="line.484"></a>
<FONT color="green">485</FONT>        private Set&lt;String&gt; findPossibleVersions( Set&lt;String&gt; versions, File metadataParentDirectory )<a name="line.485"></a>
<FONT color="green">486</FONT>        {<a name="line.486"></a>
<FONT color="green">487</FONT>            Set&lt;String&gt; result = new HashSet&lt;String&gt;( versions );<a name="line.487"></a>
<FONT color="green">488</FONT>            for ( File directory : metadataParentDirectory.listFiles() )<a name="line.488"></a>
<FONT color="green">489</FONT>            {<a name="line.489"></a>
<FONT color="green">490</FONT>                if ( directory.isDirectory() )<a name="line.490"></a>
<FONT color="green">491</FONT>                {<a name="line.491"></a>
<FONT color="green">492</FONT>                    for ( File possiblePom : directory.listFiles() )<a name="line.492"></a>
<FONT color="green">493</FONT>                    {<a name="line.493"></a>
<FONT color="green">494</FONT>                        if ( possiblePom.getName().endsWith( ".pom" ) )<a name="line.494"></a>
<FONT color="green">495</FONT>                        {<a name="line.495"></a>
<FONT color="green">496</FONT>                            result.add( directory.getName() );<a name="line.496"></a>
<FONT color="green">497</FONT>                        }<a name="line.497"></a>
<FONT color="green">498</FONT>                    }<a name="line.498"></a>
<FONT color="green">499</FONT>                }<a name="line.499"></a>
<FONT color="green">500</FONT>            }<a name="line.500"></a>
<FONT color="green">501</FONT>            return result;<a name="line.501"></a>
<FONT color="green">502</FONT>        }<a name="line.502"></a>
<FONT color="green">503</FONT>    <a name="line.503"></a>
<FONT color="green">504</FONT>        private List&lt;ArchivaRepositoryMetadata&gt; getMetadatasForManagedRepository(<a name="line.504"></a>
<FONT color="green">505</FONT>            ManagedRepositoryContent managedRepository, String logicalResource )<a name="line.505"></a>
<FONT color="green">506</FONT>        {<a name="line.506"></a>
<FONT color="green">507</FONT>            List&lt;ArchivaRepositoryMetadata&gt; metadatas = new ArrayList&lt;ArchivaRepositoryMetadata&gt;();<a name="line.507"></a>
<FONT color="green">508</FONT>            File file = new File( managedRepository.getRepoRoot(), logicalResource );<a name="line.508"></a>
<FONT color="green">509</FONT>            if ( file.exists() )<a name="line.509"></a>
<FONT color="green">510</FONT>            {<a name="line.510"></a>
<FONT color="green">511</FONT>                try<a name="line.511"></a>
<FONT color="green">512</FONT>                {<a name="line.512"></a>
<FONT color="green">513</FONT>                    ArchivaRepositoryMetadata existingMetadata = MavenMetadataReader.read( file );<a name="line.513"></a>
<FONT color="green">514</FONT>                    if ( existingMetadata != null )<a name="line.514"></a>
<FONT color="green">515</FONT>                    {<a name="line.515"></a>
<FONT color="green">516</FONT>                        metadatas.add( existingMetadata );<a name="line.516"></a>
<FONT color="green">517</FONT>                    }<a name="line.517"></a>
<FONT color="green">518</FONT>                }<a name="line.518"></a>
<FONT color="green">519</FONT>                catch ( XMLException e )<a name="line.519"></a>
<FONT color="green">520</FONT>                {<a name="line.520"></a>
<FONT color="green">521</FONT>                    log.debug( "Could not read metadata at {}. Metadata will be removed.", file.getAbsolutePath() );<a name="line.521"></a>
<FONT color="green">522</FONT>                    FileUtils.deleteQuietly( file );<a name="line.522"></a>
<FONT color="green">523</FONT>                }<a name="line.523"></a>
<FONT color="green">524</FONT>            }<a name="line.524"></a>
<FONT color="green">525</FONT>    <a name="line.525"></a>
<FONT color="green">526</FONT>            Set&lt;String&gt; proxyIds = proxies.get( managedRepository.getId() );<a name="line.526"></a>
<FONT color="green">527</FONT>            if ( proxyIds != null )<a name="line.527"></a>
<FONT color="green">528</FONT>            {<a name="line.528"></a>
<FONT color="green">529</FONT>                for ( String proxyId : proxyIds )<a name="line.529"></a>
<FONT color="green">530</FONT>                {<a name="line.530"></a>
<FONT color="green">531</FONT>                    ArchivaRepositoryMetadata proxyMetadata =<a name="line.531"></a>
<FONT color="green">532</FONT>                        readProxyMetadata( managedRepository, logicalResource, proxyId );<a name="line.532"></a>
<FONT color="green">533</FONT>                    if ( proxyMetadata != null )<a name="line.533"></a>
<FONT color="green">534</FONT>                    {<a name="line.534"></a>
<FONT color="green">535</FONT>                        metadatas.add( proxyMetadata );<a name="line.535"></a>
<FONT color="green">536</FONT>                    }<a name="line.536"></a>
<FONT color="green">537</FONT>                }<a name="line.537"></a>
<FONT color="green">538</FONT>            }<a name="line.538"></a>
<FONT color="green">539</FONT>    <a name="line.539"></a>
<FONT color="green">540</FONT>            return metadatas;<a name="line.540"></a>
<FONT color="green">541</FONT>        }<a name="line.541"></a>
<FONT color="green">542</FONT>    <a name="line.542"></a>
<FONT color="green">543</FONT>    <a name="line.543"></a>
<FONT color="green">544</FONT>        /**<a name="line.544"></a>
<FONT color="green">545</FONT>         * Update the metadata to represent the all versions/plugins of<a name="line.545"></a>
<FONT color="green">546</FONT>         * the provided groupId:artifactId project or group reference,<a name="line.546"></a>
<FONT color="green">547</FONT>         * based off of information present in the repository,<a name="line.547"></a>
<FONT color="green">548</FONT>         * the maven-metadata.xml files, and the proxy/repository specific<a name="line.548"></a>
<FONT color="green">549</FONT>         * metadata file contents.<a name="line.549"></a>
<FONT color="green">550</FONT>         * &lt;p/&gt;<a name="line.550"></a>
<FONT color="green">551</FONT>         * We must treat this as a group or a project metadata file as there is no way to know in advance<a name="line.551"></a>
<FONT color="green">552</FONT>         *<a name="line.552"></a>
<FONT color="green">553</FONT>         * @param managedRepository the managed repository where the metadata is kept.<a name="line.553"></a>
<FONT color="green">554</FONT>         * @param reference         the reference to update.<a name="line.554"></a>
<FONT color="green">555</FONT>         * @throws LayoutException<a name="line.555"></a>
<FONT color="green">556</FONT>         * @throws RepositoryMetadataException<a name="line.556"></a>
<FONT color="green">557</FONT>         * @throws IOException<a name="line.557"></a>
<FONT color="green">558</FONT>         * @throws ContentNotFoundException<a name="line.558"></a>
<FONT color="green">559</FONT>         * @deprecated<a name="line.559"></a>
<FONT color="green">560</FONT>         */<a name="line.560"></a>
<FONT color="green">561</FONT>        public void updateMetadata( ManagedRepositoryContent managedRepository, ProjectReference reference )<a name="line.561"></a>
<FONT color="green">562</FONT>            throws LayoutException, RepositoryMetadataException, IOException, ContentNotFoundException<a name="line.562"></a>
<FONT color="green">563</FONT>        {<a name="line.563"></a>
<FONT color="green">564</FONT>            File metadataFile = new File( managedRepository.getRepoRoot(), toPath( reference ) );<a name="line.564"></a>
<FONT color="green">565</FONT>    <a name="line.565"></a>
<FONT color="green">566</FONT>            long lastUpdated = getExistingLastUpdated( metadataFile );<a name="line.566"></a>
<FONT color="green">567</FONT>    <a name="line.567"></a>
<FONT color="green">568</FONT>            ArchivaRepositoryMetadata metadata = new ArchivaRepositoryMetadata();<a name="line.568"></a>
<FONT color="green">569</FONT>            metadata.setGroupId( reference.getGroupId() );<a name="line.569"></a>
<FONT color="green">570</FONT>            metadata.setArtifactId( reference.getArtifactId() );<a name="line.570"></a>
<FONT color="green">571</FONT>    <a name="line.571"></a>
<FONT color="green">572</FONT>            // Gather up all versions found in the managed repository.<a name="line.572"></a>
<FONT color="green">573</FONT>            Set&lt;String&gt; allVersions = managedRepository.getVersions( reference );<a name="line.573"></a>
<FONT color="green">574</FONT>    <a name="line.574"></a>
<FONT color="green">575</FONT>            // Gather up all plugins found in the managed repository.<a name="line.575"></a>
<FONT color="green">576</FONT>            // TODO: do we know this information instead?<a name="line.576"></a>
<FONT color="green">577</FONT>    //        Set&lt;Plugin&gt; allPlugins = managedRepository.getPlugins( reference );<a name="line.577"></a>
<FONT color="green">578</FONT>            Set&lt;Plugin&gt; allPlugins;<a name="line.578"></a>
<FONT color="green">579</FONT>            if ( metadataFile.exists() )<a name="line.579"></a>
<FONT color="green">580</FONT>            {<a name="line.580"></a>
<FONT color="green">581</FONT>                try<a name="line.581"></a>
<FONT color="green">582</FONT>                {<a name="line.582"></a>
<FONT color="green">583</FONT>                    allPlugins = new LinkedHashSet&lt;Plugin&gt;( MavenMetadataReader.read( metadataFile ).getPlugins() );<a name="line.583"></a>
<FONT color="green">584</FONT>                }<a name="line.584"></a>
<FONT color="green">585</FONT>                catch ( XMLException e )<a name="line.585"></a>
<FONT color="green">586</FONT>                {<a name="line.586"></a>
<FONT color="green">587</FONT>                    throw new RepositoryMetadataException( e.getMessage(), e );<a name="line.587"></a>
<FONT color="green">588</FONT>                }<a name="line.588"></a>
<FONT color="green">589</FONT>            }<a name="line.589"></a>
<FONT color="green">590</FONT>            else<a name="line.590"></a>
<FONT color="green">591</FONT>            {<a name="line.591"></a>
<FONT color="green">592</FONT>                allPlugins = new LinkedHashSet&lt;Plugin&gt;();<a name="line.592"></a>
<FONT color="green">593</FONT>            }<a name="line.593"></a>
<FONT color="green">594</FONT>    <a name="line.594"></a>
<FONT color="green">595</FONT>            // Does this repository have a set of remote proxied repositories?<a name="line.595"></a>
<FONT color="green">596</FONT>            Set&lt;String&gt; proxiedRepoIds = this.proxies.get( managedRepository.getId() );<a name="line.596"></a>
<FONT color="green">597</FONT>    <a name="line.597"></a>
<FONT color="green">598</FONT>            if ( CollectionUtils.isNotEmpty( proxiedRepoIds ) )<a name="line.598"></a>
<FONT color="green">599</FONT>            {<a name="line.599"></a>
<FONT color="green">600</FONT>                // Add in the proxied repo version ids too.<a name="line.600"></a>
<FONT color="green">601</FONT>                Iterator&lt;String&gt; it = proxiedRepoIds.iterator();<a name="line.601"></a>
<FONT color="green">602</FONT>                while ( it.hasNext() )<a name="line.602"></a>
<FONT color="green">603</FONT>                {<a name="line.603"></a>
<FONT color="green">604</FONT>                    String proxyId = it.next();<a name="line.604"></a>
<FONT color="green">605</FONT>    <a name="line.605"></a>
<FONT color="green">606</FONT>                    ArchivaRepositoryMetadata proxyMetadata = readProxyMetadata( managedRepository, reference, proxyId );<a name="line.606"></a>
<FONT color="green">607</FONT>                    if ( proxyMetadata != null )<a name="line.607"></a>
<FONT color="green">608</FONT>                    {<a name="line.608"></a>
<FONT color="green">609</FONT>                        allVersions.addAll( proxyMetadata.getAvailableVersions() );<a name="line.609"></a>
<FONT color="green">610</FONT>                        allPlugins.addAll( proxyMetadata.getPlugins() );<a name="line.610"></a>
<FONT color="green">611</FONT>                        long proxyLastUpdated = getLastUpdated( proxyMetadata );<a name="line.611"></a>
<FONT color="green">612</FONT>    <a name="line.612"></a>
<FONT color="green">613</FONT>                        lastUpdated = Math.max( lastUpdated, proxyLastUpdated );<a name="line.613"></a>
<FONT color="green">614</FONT>                    }<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>    <a name="line.617"></a>
<FONT color="green">618</FONT>            if ( !allVersions.isEmpty() )<a name="line.618"></a>
<FONT color="green">619</FONT>            {<a name="line.619"></a>
<FONT color="green">620</FONT>                updateMetadataVersions( allVersions, metadata );<a name="line.620"></a>
<FONT color="green">621</FONT>            }<a name="line.621"></a>
<FONT color="green">622</FONT>            else<a name="line.622"></a>
<FONT color="green">623</FONT>            {<a name="line.623"></a>
<FONT color="green">624</FONT>                // Add the plugins to the metadata model.<a name="line.624"></a>
<FONT color="green">625</FONT>                metadata.setPlugins( new ArrayList&lt;Plugin&gt;( allPlugins ) );<a name="line.625"></a>
<FONT color="green">626</FONT>    <a name="line.626"></a>
<FONT color="green">627</FONT>                // artifact ID was actually the last part of the group<a name="line.627"></a>
<FONT color="green">628</FONT>                metadata.setGroupId( metadata.getGroupId() + "." + metadata.getArtifactId() );<a name="line.628"></a>
<FONT color="green">629</FONT>                metadata.setArtifactId( null );<a name="line.629"></a>
<FONT color="green">630</FONT>            }<a name="line.630"></a>
<FONT color="green">631</FONT>    <a name="line.631"></a>
<FONT color="green">632</FONT>            if ( lastUpdated &gt; 0 )<a name="line.632"></a>
<FONT color="green">633</FONT>            {<a name="line.633"></a>
<FONT color="green">634</FONT>                metadata.setLastUpdatedTimestamp( toLastUpdatedDate( lastUpdated ) );<a name="line.634"></a>
<FONT color="green">635</FONT>            }<a name="line.635"></a>
<FONT color="green">636</FONT>    <a name="line.636"></a>
<FONT color="green">637</FONT>            // Save the metadata model to disk.<a name="line.637"></a>
<FONT color="green">638</FONT>            RepositoryMetadataWriter.write( metadata, metadataFile );<a name="line.638"></a>
<FONT color="green">639</FONT>            ChecksummedFile checksum = new ChecksummedFile( metadataFile );<a name="line.639"></a>
<FONT color="green">640</FONT>            checksum.fixChecksums( algorithms );<a name="line.640"></a>
<FONT color="green">641</FONT>        }<a name="line.641"></a>
<FONT color="green">642</FONT>    <a name="line.642"></a>
<FONT color="green">643</FONT>        private void updateMetadataVersions( Collection&lt;String&gt; allVersions, ArchivaRepositoryMetadata metadata )<a name="line.643"></a>
<FONT color="green">644</FONT>        {<a name="line.644"></a>
<FONT color="green">645</FONT>            // Sort the versions<a name="line.645"></a>
<FONT color="green">646</FONT>            List&lt;String&gt; sortedVersions = new ArrayList&lt;String&gt;( allVersions );<a name="line.646"></a>
<FONT color="green">647</FONT>            Collections.sort( sortedVersions, VersionComparator.getInstance() );<a name="line.647"></a>
<FONT color="green">648</FONT>    <a name="line.648"></a>
<FONT color="green">649</FONT>            // Split the versions into released and snapshots.<a name="line.649"></a>
<FONT color="green">650</FONT>            List&lt;String&gt; releasedVersions = new ArrayList&lt;String&gt;();<a name="line.650"></a>
<FONT color="green">651</FONT>            List&lt;String&gt; snapshotVersions = new ArrayList&lt;String&gt;();<a name="line.651"></a>
<FONT color="green">652</FONT>    <a name="line.652"></a>
<FONT color="green">653</FONT>            for ( String version : sortedVersions )<a name="line.653"></a>
<FONT color="green">654</FONT>            {<a name="line.654"></a>
<FONT color="green">655</FONT>                if ( VersionUtil.isSnapshot( version ) )<a name="line.655"></a>
<FONT color="green">656</FONT>                {<a name="line.656"></a>
<FONT color="green">657</FONT>                    snapshotVersions.add( version );<a name="line.657"></a>
<FONT color="green">658</FONT>                }<a name="line.658"></a>
<FONT color="green">659</FONT>                else<a name="line.659"></a>
<FONT color="green">660</FONT>                {<a name="line.660"></a>
<FONT color="green">661</FONT>                    releasedVersions.add( version );<a name="line.661"></a>
<FONT color="green">662</FONT>                }<a name="line.662"></a>
<FONT color="green">663</FONT>            }<a name="line.663"></a>
<FONT color="green">664</FONT>    <a name="line.664"></a>
<FONT color="green">665</FONT>            Collections.sort( releasedVersions, VersionComparator.getInstance() );<a name="line.665"></a>
<FONT color="green">666</FONT>            Collections.sort( snapshotVersions, VersionComparator.getInstance() );<a name="line.666"></a>
<FONT color="green">667</FONT>    <a name="line.667"></a>
<FONT color="green">668</FONT>            String latestVersion = sortedVersions.get( sortedVersions.size() - 1 );<a name="line.668"></a>
<FONT color="green">669</FONT>            String releaseVersion = null;<a name="line.669"></a>
<FONT color="green">670</FONT>    <a name="line.670"></a>
<FONT color="green">671</FONT>            if ( CollectionUtils.isNotEmpty( releasedVersions ) )<a name="line.671"></a>
<FONT color="green">672</FONT>            {<a name="line.672"></a>
<FONT color="green">673</FONT>                releaseVersion = releasedVersions.get( releasedVersions.size() - 1 );<a name="line.673"></a>
<FONT color="green">674</FONT>            }<a name="line.674"></a>
<FONT color="green">675</FONT>    <a name="line.675"></a>
<FONT color="green">676</FONT>            // Add the versions to the metadata model.<a name="line.676"></a>
<FONT color="green">677</FONT>            metadata.setAvailableVersions( sortedVersions );<a name="line.677"></a>
<FONT color="green">678</FONT>    <a name="line.678"></a>
<FONT color="green">679</FONT>            metadata.setLatestVersion( latestVersion );<a name="line.679"></a>
<FONT color="green">680</FONT>            metadata.setReleasedVersion( releaseVersion );<a name="line.680"></a>
<FONT color="green">681</FONT>        }<a name="line.681"></a>
<FONT color="green">682</FONT>    <a name="line.682"></a>
<FONT color="green">683</FONT>        private Date toLastUpdatedDate( long lastUpdated )<a name="line.683"></a>
<FONT color="green">684</FONT>        {<a name="line.684"></a>
<FONT color="green">685</FONT>            Calendar cal = Calendar.getInstance( DateUtils.UTC_TIME_ZONE );<a name="line.685"></a>
<FONT color="green">686</FONT>            cal.setTimeInMillis( lastUpdated );<a name="line.686"></a>
<FONT color="green">687</FONT>    <a name="line.687"></a>
<FONT color="green">688</FONT>            return cal.getTime();<a name="line.688"></a>
<FONT color="green">689</FONT>        }<a name="line.689"></a>
<FONT color="green">690</FONT>    <a name="line.690"></a>
<FONT color="green">691</FONT>        private long toLastUpdatedLong( String timestampString )<a name="line.691"></a>
<FONT color="green">692</FONT>        {<a name="line.692"></a>
<FONT color="green">693</FONT>            try<a name="line.693"></a>
<FONT color="green">694</FONT>            {<a name="line.694"></a>
<FONT color="green">695</FONT>                Date date = lastUpdatedFormat.parse( timestampString );<a name="line.695"></a>
<FONT color="green">696</FONT>                Calendar cal = Calendar.getInstance( DateUtils.UTC_TIME_ZONE );<a name="line.696"></a>
<FONT color="green">697</FONT>                cal.setTime( date );<a name="line.697"></a>
<FONT color="green">698</FONT>    <a name="line.698"></a>
<FONT color="green">699</FONT>                return cal.getTimeInMillis();<a name="line.699"></a>
<FONT color="green">700</FONT>            }<a name="line.700"></a>
<FONT color="green">701</FONT>            catch ( ParseException e )<a name="line.701"></a>
<FONT color="green">702</FONT>            {<a name="line.702"></a>
<FONT color="green">703</FONT>                return 0;<a name="line.703"></a>
<FONT color="green">704</FONT>            }<a name="line.704"></a>
<FONT color="green">705</FONT>        }<a name="line.705"></a>
<FONT color="green">706</FONT>    <a name="line.706"></a>
<FONT color="green">707</FONT>        private long getLastUpdated( ArchivaRepositoryMetadata metadata )<a name="line.707"></a>
<FONT color="green">708</FONT>        {<a name="line.708"></a>
<FONT color="green">709</FONT>            if ( metadata == null )<a name="line.709"></a>
<FONT color="green">710</FONT>            {<a name="line.710"></a>
<FONT color="green">711</FONT>                // Doesn't exist.<a name="line.711"></a>
<FONT color="green">712</FONT>                return 0;<a name="line.712"></a>
<FONT color="green">713</FONT>            }<a name="line.713"></a>
<FONT color="green">714</FONT>    <a name="line.714"></a>
<FONT color="green">715</FONT>            try<a name="line.715"></a>
<FONT color="green">716</FONT>            {<a name="line.716"></a>
<FONT color="green">717</FONT>                String lastUpdated = metadata.getLastUpdated();<a name="line.717"></a>
<FONT color="green">718</FONT>                if ( StringUtils.isBlank( lastUpdated ) )<a name="line.718"></a>
<FONT color="green">719</FONT>                {<a name="line.719"></a>
<FONT color="green">720</FONT>                    // Not set.<a name="line.720"></a>
<FONT color="green">721</FONT>                    return 0;<a name="line.721"></a>
<FONT color="green">722</FONT>                }<a name="line.722"></a>
<FONT color="green">723</FONT>    <a name="line.723"></a>
<FONT color="green">724</FONT>                Date lastUpdatedDate = lastUpdatedFormat.parse( lastUpdated );<a name="line.724"></a>
<FONT color="green">725</FONT>                return lastUpdatedDate.getTime();<a name="line.725"></a>
<FONT color="green">726</FONT>            }<a name="line.726"></a>
<FONT color="green">727</FONT>            catch ( ParseException e )<a name="line.727"></a>
<FONT color="green">728</FONT>            {<a name="line.728"></a>
<FONT color="green">729</FONT>                // Bad format on the last updated string.<a name="line.729"></a>
<FONT color="green">730</FONT>                return 0;<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>    <a name="line.733"></a>
<FONT color="green">734</FONT>        private long getExistingLastUpdated( File metadataFile )<a name="line.734"></a>
<FONT color="green">735</FONT>        {<a name="line.735"></a>
<FONT color="green">736</FONT>            if ( !metadataFile.exists() )<a name="line.736"></a>
<FONT color="green">737</FONT>            {<a name="line.737"></a>
<FONT color="green">738</FONT>                // Doesn't exist.<a name="line.738"></a>
<FONT color="green">739</FONT>                return 0;<a name="line.739"></a>
<FONT color="green">740</FONT>            }<a name="line.740"></a>
<FONT color="green">741</FONT>    <a name="line.741"></a>
<FONT color="green">742</FONT>            try<a name="line.742"></a>
<FONT color="green">743</FONT>            {<a name="line.743"></a>
<FONT color="green">744</FONT>                ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( metadataFile );<a name="line.744"></a>
<FONT color="green">745</FONT>    <a name="line.745"></a>
<FONT color="green">746</FONT>                return getLastUpdated( metadata );<a name="line.746"></a>
<FONT color="green">747</FONT>            }<a name="line.747"></a>
<FONT color="green">748</FONT>            catch ( XMLException e )<a name="line.748"></a>
<FONT color="green">749</FONT>            {<a name="line.749"></a>
<FONT color="green">750</FONT>                // Error.<a name="line.750"></a>
<FONT color="green">751</FONT>                return 0;<a name="line.751"></a>
<FONT color="green">752</FONT>            }<a name="line.752"></a>
<FONT color="green">753</FONT>        }<a name="line.753"></a>
<FONT color="green">754</FONT>    <a name="line.754"></a>
<FONT color="green">755</FONT>        /**<a name="line.755"></a>
<FONT color="green">756</FONT>         * Update the metadata based on the following rules.<a name="line.756"></a>
<FONT color="green">757</FONT>         * &lt;p/&gt;<a name="line.757"></a>
<FONT color="green">758</FONT>         * 1) If this is a SNAPSHOT reference, then utilize the proxy/repository specific<a name="line.758"></a>
<FONT color="green">759</FONT>         * metadata files to represent the current / latest SNAPSHOT available.<a name="line.759"></a>
<FONT color="green">760</FONT>         * 2) If this is a RELEASE reference, and the metadata file does not exist, then<a name="line.760"></a>
<FONT color="green">761</FONT>         * create the metadata file with contents required of the VersionedReference<a name="line.761"></a>
<FONT color="green">762</FONT>         *<a name="line.762"></a>
<FONT color="green">763</FONT>         * @param managedRepository the managed repository where the metadata is kept.<a name="line.763"></a>
<FONT color="green">764</FONT>         * @param reference         the versioned reference to update<a name="line.764"></a>
<FONT color="green">765</FONT>         * @throws LayoutException<a name="line.765"></a>
<FONT color="green">766</FONT>         * @throws RepositoryMetadataException<a name="line.766"></a>
<FONT color="green">767</FONT>         * @throws IOException<a name="line.767"></a>
<FONT color="green">768</FONT>         * @throws ContentNotFoundException<a name="line.768"></a>
<FONT color="green">769</FONT>         * @deprecated<a name="line.769"></a>
<FONT color="green">770</FONT>         */<a name="line.770"></a>
<FONT color="green">771</FONT>        public void updateMetadata( ManagedRepositoryContent managedRepository, VersionedReference reference )<a name="line.771"></a>
<FONT color="green">772</FONT>            throws LayoutException, RepositoryMetadataException, IOException, ContentNotFoundException<a name="line.772"></a>
<FONT color="green">773</FONT>        {<a name="line.773"></a>
<FONT color="green">774</FONT>            File metadataFile = new File( managedRepository.getRepoRoot(), toPath( reference ) );<a name="line.774"></a>
<FONT color="green">775</FONT>    <a name="line.775"></a>
<FONT color="green">776</FONT>            long lastUpdated = getExistingLastUpdated( metadataFile );<a name="line.776"></a>
<FONT color="green">777</FONT>    <a name="line.777"></a>
<FONT color="green">778</FONT>            ArchivaRepositoryMetadata metadata = new ArchivaRepositoryMetadata();<a name="line.778"></a>
<FONT color="green">779</FONT>            metadata.setGroupId( reference.getGroupId() );<a name="line.779"></a>
<FONT color="green">780</FONT>            metadata.setArtifactId( reference.getArtifactId() );<a name="line.780"></a>
<FONT color="green">781</FONT>    <a name="line.781"></a>
<FONT color="green">782</FONT>            if ( VersionUtil.isSnapshot( reference.getVersion() ) )<a name="line.782"></a>
<FONT color="green">783</FONT>            {<a name="line.783"></a>
<FONT color="green">784</FONT>                // Do SNAPSHOT handling.<a name="line.784"></a>
<FONT color="green">785</FONT>                metadata.setVersion( VersionUtil.getBaseVersion( reference.getVersion() ) );<a name="line.785"></a>
<FONT color="green">786</FONT>    <a name="line.786"></a>
<FONT color="green">787</FONT>                // Gather up all of the versions found in the reference dir, and any<a name="line.787"></a>
<FONT color="green">788</FONT>                // proxied maven-metadata.xml files.<a name="line.788"></a>
<FONT color="green">789</FONT>                Set&lt;String&gt; snapshotVersions = gatherSnapshotVersions( managedRepository, reference );<a name="line.789"></a>
<FONT color="green">790</FONT>    <a name="line.790"></a>
<FONT color="green">791</FONT>                if ( snapshotVersions.isEmpty() )<a name="line.791"></a>
<FONT color="green">792</FONT>                {<a name="line.792"></a>
<FONT color="green">793</FONT>                    throw new ContentNotFoundException(<a name="line.793"></a>
<FONT color="green">794</FONT>                        "No snapshot versions found on reference [" + VersionedReference.toKey( reference ) + "]." );<a name="line.794"></a>
<FONT color="green">795</FONT>                }<a name="line.795"></a>
<FONT color="green">796</FONT>    <a name="line.796"></a>
<FONT color="green">797</FONT>                // sort the list to determine to aide in determining the Latest version.<a name="line.797"></a>
<FONT color="green">798</FONT>                List&lt;String&gt; sortedVersions = new ArrayList&lt;String&gt;();<a name="line.798"></a>
<FONT color="green">799</FONT>                sortedVersions.addAll( snapshotVersions );<a name="line.799"></a>
<FONT color="green">800</FONT>                Collections.sort( sortedVersions, new VersionComparator() );<a name="line.800"></a>
<FONT color="green">801</FONT>    <a name="line.801"></a>
<FONT color="green">802</FONT>                String latestVersion = sortedVersions.get( sortedVersions.size() - 1 );<a name="line.802"></a>
<FONT color="green">803</FONT>    <a name="line.803"></a>
<FONT color="green">804</FONT>                if ( VersionUtil.isUniqueSnapshot( latestVersion ) )<a name="line.804"></a>
<FONT color="green">805</FONT>                {<a name="line.805"></a>
<FONT color="green">806</FONT>                    // The latestVersion will contain the full version string "1.0-alpha-5-20070821.213044-8"<a name="line.806"></a>
<FONT color="green">807</FONT>                    // This needs to be broken down into ${base}-${timestamp}-${build_number}<a name="line.807"></a>
<FONT color="green">808</FONT>    <a name="line.808"></a>
<FONT color="green">809</FONT>                    Matcher m = VersionUtil.UNIQUE_SNAPSHOT_PATTERN.matcher( latestVersion );<a name="line.809"></a>
<FONT color="green">810</FONT>                    if ( m.matches() )<a name="line.810"></a>
<FONT color="green">811</FONT>                    {<a name="line.811"></a>
<FONT color="green">812</FONT>                        metadata.setSnapshotVersion( new SnapshotVersion() );<a name="line.812"></a>
<FONT color="green">813</FONT>                        int buildNumber = NumberUtils.toInt( m.group( 3 ), -1 );<a name="line.813"></a>
<FONT color="green">814</FONT>                        metadata.getSnapshotVersion().setBuildNumber( buildNumber );<a name="line.814"></a>
<FONT color="green">815</FONT>    <a name="line.815"></a>
<FONT color="green">816</FONT>                        Matcher mtimestamp = VersionUtil.TIMESTAMP_PATTERN.matcher( m.group( 2 ) );<a name="line.816"></a>
<FONT color="green">817</FONT>                        if ( mtimestamp.matches() )<a name="line.817"></a>
<FONT color="green">818</FONT>                        {<a name="line.818"></a>
<FONT color="green">819</FONT>                            String tsDate = mtimestamp.group( 1 );<a name="line.819"></a>
<FONT color="green">820</FONT>                            String tsTime = mtimestamp.group( 2 );<a name="line.820"></a>
<FONT color="green">821</FONT>    <a name="line.821"></a>
<FONT color="green">822</FONT>                            long snapshotLastUpdated = toLastUpdatedLong( tsDate + tsTime );<a name="line.822"></a>
<FONT color="green">823</FONT>    <a name="line.823"></a>
<FONT color="green">824</FONT>                            lastUpdated = Math.max( lastUpdated, snapshotLastUpdated );<a name="line.824"></a>
<FONT color="green">825</FONT>    <a name="line.825"></a>
<FONT color="green">826</FONT>                            metadata.getSnapshotVersion().setTimestamp( m.group( 2 ) );<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>                }<a name="line.829"></a>
<FONT color="green">830</FONT>                else if ( VersionUtil.isGenericSnapshot( latestVersion ) )<a name="line.830"></a>
<FONT color="green">831</FONT>                {<a name="line.831"></a>
<FONT color="green">832</FONT>                    // The latestVersion ends with the generic version string.<a name="line.832"></a>
<FONT color="green">833</FONT>                    // Example: 1.0-alpha-5-SNAPSHOT<a name="line.833"></a>
<FONT color="green">834</FONT>    <a name="line.834"></a>
<FONT color="green">835</FONT>                    metadata.setSnapshotVersion( new SnapshotVersion() );<a name="line.835"></a>
<FONT color="green">836</FONT>    <a name="line.836"></a>
<FONT color="green">837</FONT>                    /* Disabled due to decision in [MRM-535].<a name="line.837"></a>
<FONT color="green">838</FONT>                     * Do not set metadata.lastUpdated to file.lastModified.<a name="line.838"></a>
<FONT color="green">839</FONT>                     * <a name="line.839"></a>
<FONT color="green">840</FONT>                     * Should this be the last updated timestamp of the file, or in the case of an <a name="line.840"></a>
<FONT color="green">841</FONT>                     * archive, the most recent timestamp in the archive?<a name="line.841"></a>
<FONT color="green">842</FONT>                     * <a name="line.842"></a>
<FONT color="green">843</FONT>                    ArtifactReference artifact = getFirstArtifact( managedRepository, reference );<a name="line.843"></a>
<FONT color="green">844</FONT>    <a name="line.844"></a>
<FONT color="green">845</FONT>                    if ( artifact == null )<a name="line.845"></a>
<FONT color="green">846</FONT>                    {<a name="line.846"></a>
<FONT color="green">847</FONT>                        throw new IOException( "Not snapshot artifact found to reference in " + reference );<a name="line.847"></a>
<FONT color="green">848</FONT>                    }<a name="line.848"></a>
<FONT color="green">849</FONT>    <a name="line.849"></a>
<FONT color="green">850</FONT>                    File artifactFile = managedRepository.toFile( artifact );<a name="line.850"></a>
<FONT color="green">851</FONT>    <a name="line.851"></a>
<FONT color="green">852</FONT>                    if ( artifactFile.exists() )<a name="line.852"></a>
<FONT color="green">853</FONT>                    {<a name="line.853"></a>
<FONT color="green">854</FONT>                        Date lastModified = new Date( artifactFile.lastModified() );<a name="line.854"></a>
<FONT color="green">855</FONT>                        metadata.setLastUpdatedTimestamp( lastModified );<a name="line.855"></a>
<FONT color="green">856</FONT>                    }<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>                else<a name="line.859"></a>
<FONT color="green">860</FONT>                {<a name="line.860"></a>
<FONT color="green">861</FONT>                    throw new RepositoryMetadataException(<a name="line.861"></a>
<FONT color="green">862</FONT>                        "Unable to process snapshot version &lt;" + latestVersion + "&gt; reference &lt;" + reference + "&gt;" );<a name="line.862"></a>
<FONT color="green">863</FONT>                }<a name="line.863"></a>
<FONT color="green">864</FONT>            }<a name="line.864"></a>
<FONT color="green">865</FONT>            else<a name="line.865"></a>
<FONT color="green">866</FONT>            {<a name="line.866"></a>
<FONT color="green">867</FONT>                // Do RELEASE handling.<a name="line.867"></a>
<FONT color="green">868</FONT>                metadata.setVersion( reference.getVersion() );<a name="line.868"></a>
<FONT color="green">869</FONT>            }<a name="line.869"></a>
<FONT color="green">870</FONT>    <a name="line.870"></a>
<FONT color="green">871</FONT>            // Set last updated<a name="line.871"></a>
<FONT color="green">872</FONT>            if ( lastUpdated &gt; 0 )<a name="line.872"></a>
<FONT color="green">873</FONT>            {<a name="line.873"></a>
<FONT color="green">874</FONT>                metadata.setLastUpdatedTimestamp( toLastUpdatedDate( lastUpdated ) );<a name="line.874"></a>
<FONT color="green">875</FONT>            }<a name="line.875"></a>
<FONT color="green">876</FONT>    <a name="line.876"></a>
<FONT color="green">877</FONT>            // Save the metadata model to disk.<a name="line.877"></a>
<FONT color="green">878</FONT>            RepositoryMetadataWriter.write( metadata, metadataFile );<a name="line.878"></a>
<FONT color="green">879</FONT>            ChecksummedFile checksum = new ChecksummedFile( metadataFile );<a name="line.879"></a>
<FONT color="green">880</FONT>            checksum.fixChecksums( algorithms );<a name="line.880"></a>
<FONT color="green">881</FONT>        }<a name="line.881"></a>
<FONT color="green">882</FONT>    <a name="line.882"></a>
<FONT color="green">883</FONT>        private void initConfigVariables()<a name="line.883"></a>
<FONT color="green">884</FONT>        {<a name="line.884"></a>
<FONT color="green">885</FONT>            synchronized ( this.artifactPatterns )<a name="line.885"></a>
<FONT color="green">886</FONT>            {<a name="line.886"></a>
<FONT color="green">887</FONT>                this.artifactPatterns.clear();<a name="line.887"></a>
<FONT color="green">888</FONT>    <a name="line.888"></a>
<FONT color="green">889</FONT>                this.artifactPatterns.addAll( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) );<a name="line.889"></a>
<FONT color="green">890</FONT>            }<a name="line.890"></a>
<FONT color="green">891</FONT>    <a name="line.891"></a>
<FONT color="green">892</FONT>            synchronized ( proxies )<a name="line.892"></a>
<FONT color="green">893</FONT>            {<a name="line.893"></a>
<FONT color="green">894</FONT>                this.proxies.clear();<a name="line.894"></a>
<FONT color="green">895</FONT>    <a name="line.895"></a>
<FONT color="green">896</FONT>                List&lt;ProxyConnectorConfiguration&gt; proxyConfigs = configuration.getConfiguration().getProxyConnectors();<a name="line.896"></a>
<FONT color="green">897</FONT>                for ( ProxyConnectorConfiguration proxyConfig : proxyConfigs )<a name="line.897"></a>
<FONT color="green">898</FONT>                {<a name="line.898"></a>
<FONT color="green">899</FONT>                    String key = proxyConfig.getSourceRepoId();<a name="line.899"></a>
<FONT color="green">900</FONT>    <a name="line.900"></a>
<FONT color="green">901</FONT>                    Set&lt;String&gt; remoteRepoIds = this.proxies.get( key );<a name="line.901"></a>
<FONT color="green">902</FONT>    <a name="line.902"></a>
<FONT color="green">903</FONT>                    if ( remoteRepoIds == null )<a name="line.903"></a>
<FONT color="green">904</FONT>                    {<a name="line.904"></a>
<FONT color="green">905</FONT>                        remoteRepoIds = new HashSet&lt;String&gt;();<a name="line.905"></a>
<FONT color="green">906</FONT>                    }<a name="line.906"></a>
<FONT color="green">907</FONT>    <a name="line.907"></a>
<FONT color="green">908</FONT>                    remoteRepoIds.add( proxyConfig.getTargetRepoId() );<a name="line.908"></a>
<FONT color="green">909</FONT>    <a name="line.909"></a>
<FONT color="green">910</FONT>                    this.proxies.put( key, remoteRepoIds );<a name="line.910"></a>
<FONT color="green">911</FONT>                }<a name="line.911"></a>
<FONT color="green">912</FONT>            }<a name="line.912"></a>
<FONT color="green">913</FONT>        }<a name="line.913"></a>
<FONT color="green">914</FONT>    <a name="line.914"></a>
<FONT color="green">915</FONT>        /**<a name="line.915"></a>
<FONT color="green">916</FONT>         * Get the first Artifact found in the provided VersionedReference location.<a name="line.916"></a>
<FONT color="green">917</FONT>         *<a name="line.917"></a>
<FONT color="green">918</FONT>         * @param managedRepository the repository to search within.<a name="line.918"></a>
<FONT color="green">919</FONT>         * @param reference         the reference to the versioned reference to search within<a name="line.919"></a>
<FONT color="green">920</FONT>         * @return the ArtifactReference to the first artifact located within the versioned reference. or null if<a name="line.920"></a>
<FONT color="green">921</FONT>         *         no artifact was found within the versioned reference.<a name="line.921"></a>
<FONT color="green">922</FONT>         * @throws IOException     if the versioned reference is invalid (example: doesn't exist, or isn't a directory)<a name="line.922"></a>
<FONT color="green">923</FONT>         * @throws LayoutException<a name="line.923"></a>
<FONT color="green">924</FONT>         */<a name="line.924"></a>
<FONT color="green">925</FONT>        public ArtifactReference getFirstArtifact( ManagedRepositoryContent managedRepository,<a name="line.925"></a>
<FONT color="green">926</FONT>                                                   VersionedReference reference )<a name="line.926"></a>
<FONT color="green">927</FONT>            throws LayoutException, IOException<a name="line.927"></a>
<FONT color="green">928</FONT>        {<a name="line.928"></a>
<FONT color="green">929</FONT>            String path = toPath( reference );<a name="line.929"></a>
<FONT color="green">930</FONT>    <a name="line.930"></a>
<FONT color="green">931</FONT>            int idx = path.lastIndexOf( '/' );<a name="line.931"></a>
<FONT color="green">932</FONT>            if ( idx &gt; 0 )<a name="line.932"></a>
<FONT color="green">933</FONT>            {<a name="line.933"></a>
<FONT color="green">934</FONT>                path = path.substring( 0, idx );<a name="line.934"></a>
<FONT color="green">935</FONT>            }<a name="line.935"></a>
<FONT color="green">936</FONT>    <a name="line.936"></a>
<FONT color="green">937</FONT>            File repoDir = new File( managedRepository.getRepoRoot(), path );<a name="line.937"></a>
<FONT color="green">938</FONT>    <a name="line.938"></a>
<FONT color="green">939</FONT>            if ( !repoDir.exists() )<a name="line.939"></a>
<FONT color="green">940</FONT>            {<a name="line.940"></a>
<FONT color="green">941</FONT>                throw new IOException( "Unable to gather the list of snapshot versions on a non-existant directory: "<a name="line.941"></a>
<FONT color="green">942</FONT>                                           + repoDir.getAbsolutePath() );<a name="line.942"></a>
<FONT color="green">943</FONT>            }<a name="line.943"></a>
<FONT color="green">944</FONT>    <a name="line.944"></a>
<FONT color="green">945</FONT>            if ( !repoDir.isDirectory() )<a name="line.945"></a>
<FONT color="green">946</FONT>            {<a name="line.946"></a>
<FONT color="green">947</FONT>                throw new IOException(<a name="line.947"></a>
<FONT color="green">948</FONT>                    "Unable to gather the list of snapshot versions on a non-directory: " + repoDir.getAbsolutePath() );<a name="line.948"></a>
<FONT color="green">949</FONT>            }<a name="line.949"></a>
<FONT color="green">950</FONT>    <a name="line.950"></a>
<FONT color="green">951</FONT>            File repoFiles[] = repoDir.listFiles();<a name="line.951"></a>
<FONT color="green">952</FONT>            for ( int i = 0; i &lt; repoFiles.length; i++ )<a name="line.952"></a>
<FONT color="green">953</FONT>            {<a name="line.953"></a>
<FONT color="green">954</FONT>                if ( repoFiles[i].isDirectory() )<a name="line.954"></a>
<FONT color="green">955</FONT>                {<a name="line.955"></a>
<FONT color="green">956</FONT>                    // Skip it. it's a directory.<a name="line.956"></a>
<FONT color="green">957</FONT>                    continue;<a name="line.957"></a>
<FONT color="green">958</FONT>                }<a name="line.958"></a>
<FONT color="green">959</FONT>    <a name="line.959"></a>
<FONT color="green">960</FONT>                String relativePath = PathUtil.getRelative( managedRepository.getRepoRoot(), repoFiles[i] );<a name="line.960"></a>
<FONT color="green">961</FONT>    <a name="line.961"></a>
<FONT color="green">962</FONT>                if ( filetypes.matchesArtifactPattern( relativePath ) )<a name="line.962"></a>
<FONT color="green">963</FONT>                {<a name="line.963"></a>
<FONT color="green">964</FONT>                    ArtifactReference artifact = managedRepository.toArtifactReference( relativePath );<a name="line.964"></a>
<FONT color="green">965</FONT>    <a name="line.965"></a>
<FONT color="green">966</FONT>                    return artifact;<a name="line.966"></a>
<FONT color="green">967</FONT>                }<a name="line.967"></a>
<FONT color="green">968</FONT>            }<a name="line.968"></a>
<FONT color="green">969</FONT>    <a name="line.969"></a>
<FONT color="green">970</FONT>            // No artifact was found.<a name="line.970"></a>
<FONT color="green">971</FONT>            return null;<a name="line.971"></a>
<FONT color="green">972</FONT>        }<a name="line.972"></a>
<FONT color="green">973</FONT>    <a name="line.973"></a>
<FONT color="green">974</FONT>        public ArchivaConfiguration getConfiguration()<a name="line.974"></a>
<FONT color="green">975</FONT>        {<a name="line.975"></a>
<FONT color="green">976</FONT>            return configuration;<a name="line.976"></a>
<FONT color="green">977</FONT>        }<a name="line.977"></a>
<FONT color="green">978</FONT>    <a name="line.978"></a>
<FONT color="green">979</FONT>        public void setConfiguration( ArchivaConfiguration configuration )<a name="line.979"></a>
<FONT color="green">980</FONT>        {<a name="line.980"></a>
<FONT color="green">981</FONT>            this.configuration = configuration;<a name="line.981"></a>
<FONT color="green">982</FONT>        }<a name="line.982"></a>
<FONT color="green">983</FONT>    <a name="line.983"></a>
<FONT color="green">984</FONT>        public FileTypes getFiletypes()<a name="line.984"></a>
<FONT color="green">985</FONT>        {<a name="line.985"></a>
<FONT color="green">986</FONT>            return filetypes;<a name="line.986"></a>
<FONT color="green">987</FONT>        }<a name="line.987"></a>
<FONT color="green">988</FONT>    <a name="line.988"></a>
<FONT color="green">989</FONT>        public void setFiletypes( FileTypes filetypes )<a name="line.989"></a>
<FONT color="green">990</FONT>        {<a name="line.990"></a>
<FONT color="green">991</FONT>            this.filetypes = filetypes;<a name="line.991"></a>
<FONT color="green">992</FONT>        }<a name="line.992"></a>
<FONT color="green">993</FONT>    }<a name="line.993"></a>




























































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