<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    package org.apache.archiva.rest.services;<a name="line.1"></a>
<FONT color="green">002</FONT>    /*<a name="line.2"></a>
<FONT color="green">003</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
<FONT color="green">004</FONT>     * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
<FONT color="green">005</FONT>     * distributed with this work for additional information<a name="line.5"></a>
<FONT color="green">006</FONT>     * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
<FONT color="green">007</FONT>     * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
<FONT color="green">008</FONT>     * "License"); you may not use this file except in compliance<a name="line.8"></a>
<FONT color="green">009</FONT>     * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
<FONT color="green">010</FONT>     *<a name="line.10"></a>
<FONT color="green">011</FONT>     *   http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
<FONT color="green">012</FONT>     *<a name="line.12"></a>
<FONT color="green">013</FONT>     * Unless required by applicable law or agreed to in writing,<a name="line.13"></a>
<FONT color="green">014</FONT>     * software distributed under the License is distributed on an<a name="line.14"></a>
<FONT color="green">015</FONT>     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.15"></a>
<FONT color="green">016</FONT>     * KIND, either express or implied.  See the License for the<a name="line.16"></a>
<FONT color="green">017</FONT>     * specific language governing permissions and limitations<a name="line.17"></a>
<FONT color="green">018</FONT>     * under the License.<a name="line.18"></a>
<FONT color="green">019</FONT>     */<a name="line.19"></a>
<FONT color="green">020</FONT>    <a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.archiva.admin.model.RepositoryAdminException;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.archiva.admin.model.beans.ManagedRepository;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.archiva.common.utils.VersionComparator;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.archiva.common.utils.VersionUtil;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.archiva.dependency.tree.maven2.DependencyTreeBuilder;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.archiva.maven2.metadata.MavenMetadataReader;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.archiva.maven2.model.Artifact;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.archiva.maven2.model.TreeEntry;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.archiva.metadata.generic.GenericMetadataFacet;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.archiva.metadata.model.ArtifactMetadata;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.archiva.metadata.model.MetadataFacet;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.archiva.metadata.model.ProjectVersionMetadata;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.archiva.metadata.model.ProjectVersionReference;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.apache.archiva.metadata.repository.MetadataRepository;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.apache.archiva.metadata.repository.MetadataRepositoryException;<a name="line.35"></a>
<FONT color="green">036</FONT>    import org.apache.archiva.metadata.repository.MetadataResolutionException;<a name="line.36"></a>
<FONT color="green">037</FONT>    import org.apache.archiva.metadata.repository.MetadataResolver;<a name="line.37"></a>
<FONT color="green">038</FONT>    import org.apache.archiva.metadata.repository.RepositorySession;<a name="line.38"></a>
<FONT color="green">039</FONT>    import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMetadataVersionComparator;<a name="line.39"></a>
<FONT color="green">040</FONT>    import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet;<a name="line.40"></a>
<FONT color="green">041</FONT>    import org.apache.archiva.model.ArchivaArtifact;<a name="line.41"></a>
<FONT color="green">042</FONT>    import org.apache.archiva.model.ArchivaRepositoryMetadata;<a name="line.42"></a>
<FONT color="green">043</FONT>    import org.apache.archiva.proxy.model.RepositoryProxyConnectors;<a name="line.43"></a>
<FONT color="green">044</FONT>    import org.apache.archiva.repository.ManagedRepositoryContent;<a name="line.44"></a>
<FONT color="green">045</FONT>    import org.apache.archiva.repository.RepositoryContentFactory;<a name="line.45"></a>
<FONT color="green">046</FONT>    import org.apache.archiva.repository.RepositoryException;<a name="line.46"></a>
<FONT color="green">047</FONT>    import org.apache.archiva.repository.RepositoryNotFoundException;<a name="line.47"></a>
<FONT color="green">048</FONT>    import org.apache.archiva.repository.metadata.MetadataTools;<a name="line.48"></a>
<FONT color="green">049</FONT>    import org.apache.archiva.rest.api.model.ArtifactContent;<a name="line.49"></a>
<FONT color="green">050</FONT>    import org.apache.archiva.rest.api.model.ArtifactContentEntry;<a name="line.50"></a>
<FONT color="green">051</FONT>    import org.apache.archiva.rest.api.model.BrowseResult;<a name="line.51"></a>
<FONT color="green">052</FONT>    import org.apache.archiva.rest.api.model.BrowseResultEntry;<a name="line.52"></a>
<FONT color="green">053</FONT>    import org.apache.archiva.rest.api.model.Entry;<a name="line.53"></a>
<FONT color="green">054</FONT>    import org.apache.archiva.rest.api.model.MetadataAddRequest;<a name="line.54"></a>
<FONT color="green">055</FONT>    import org.apache.archiva.rest.api.model.VersionsList;<a name="line.55"></a>
<FONT color="green">056</FONT>    import org.apache.archiva.rest.api.services.ArchivaRestServiceException;<a name="line.56"></a>
<FONT color="green">057</FONT>    import org.apache.archiva.rest.api.services.BrowseService;<a name="line.57"></a>
<FONT color="green">058</FONT>    import org.apache.archiva.rest.services.utils.ArtifactContentEntryComparator;<a name="line.58"></a>
<FONT color="green">059</FONT>    import org.apache.archiva.security.ArchivaSecurityException;<a name="line.59"></a>
<FONT color="green">060</FONT>    import org.apache.archiva.xml.XMLException;<a name="line.60"></a>
<FONT color="green">061</FONT>    import org.apache.commons.collections.CollectionUtils;<a name="line.61"></a>
<FONT color="green">062</FONT>    import org.apache.commons.io.FileUtils;<a name="line.62"></a>
<FONT color="green">063</FONT>    import org.apache.commons.io.IOUtils;<a name="line.63"></a>
<FONT color="green">064</FONT>    import org.apache.commons.lang.StringUtils;<a name="line.64"></a>
<FONT color="green">065</FONT>    import org.springframework.stereotype.Service;<a name="line.65"></a>
<FONT color="green">066</FONT>    <a name="line.66"></a>
<FONT color="green">067</FONT>    import javax.inject.Inject;<a name="line.67"></a>
<FONT color="green">068</FONT>    import javax.inject.Named;<a name="line.68"></a>
<FONT color="green">069</FONT>    import javax.ws.rs.core.Response;<a name="line.69"></a>
<FONT color="green">070</FONT>    import java.io.File;<a name="line.70"></a>
<FONT color="green">071</FONT>    import java.io.IOException;<a name="line.71"></a>
<FONT color="green">072</FONT>    import java.io.InputStream;<a name="line.72"></a>
<FONT color="green">073</FONT>    import java.util.ArrayList;<a name="line.73"></a>
<FONT color="green">074</FONT>    import java.util.Collection;<a name="line.74"></a>
<FONT color="green">075</FONT>    import java.util.Collections;<a name="line.75"></a>
<FONT color="green">076</FONT>    import java.util.Enumeration;<a name="line.76"></a>
<FONT color="green">077</FONT>    import java.util.HashMap;<a name="line.77"></a>
<FONT color="green">078</FONT>    import java.util.LinkedHashSet;<a name="line.78"></a>
<FONT color="green">079</FONT>    import java.util.List;<a name="line.79"></a>
<FONT color="green">080</FONT>    import java.util.Map;<a name="line.80"></a>
<FONT color="green">081</FONT>    import java.util.Set;<a name="line.81"></a>
<FONT color="green">082</FONT>    import java.util.jar.JarEntry;<a name="line.82"></a>
<FONT color="green">083</FONT>    import java.util.jar.JarFile;<a name="line.83"></a>
<FONT color="green">084</FONT>    import java.util.zip.ZipEntry;<a name="line.84"></a>
<FONT color="green">085</FONT>    <a name="line.85"></a>
<FONT color="green">086</FONT>    /**<a name="line.86"></a>
<FONT color="green">087</FONT>     * @author Olivier Lamy<a name="line.87"></a>
<FONT color="green">088</FONT>     * @since 1.4-M3<a name="line.88"></a>
<FONT color="green">089</FONT>     */<a name="line.89"></a>
<FONT color="green">090</FONT>    @Service( "browseService#rest" )<a name="line.90"></a>
<FONT color="green">091</FONT>    public class DefaultBrowseService<a name="line.91"></a>
<FONT color="green">092</FONT>        extends AbstractRestService<a name="line.92"></a>
<FONT color="green">093</FONT>        implements BrowseService<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>        @Inject<a name="line.96"></a>
<FONT color="green">097</FONT>        private DependencyTreeBuilder dependencyTreeBuilder;<a name="line.97"></a>
<FONT color="green">098</FONT>    <a name="line.98"></a>
<FONT color="green">099</FONT>        @Inject<a name="line.99"></a>
<FONT color="green">100</FONT>        private RepositoryContentFactory repositoryContentFactory;<a name="line.100"></a>
<FONT color="green">101</FONT>    <a name="line.101"></a>
<FONT color="green">102</FONT>        @Inject<a name="line.102"></a>
<FONT color="green">103</FONT>        @Named( value = "repositoryProxyConnectors#default" )<a name="line.103"></a>
<FONT color="green">104</FONT>        private RepositoryProxyConnectors connectors;<a name="line.104"></a>
<FONT color="green">105</FONT>    <a name="line.105"></a>
<FONT color="green">106</FONT>        public BrowseResult getRootGroups( String repositoryId )<a name="line.106"></a>
<FONT color="green">107</FONT>            throws ArchivaRestServiceException<a name="line.107"></a>
<FONT color="green">108</FONT>        {<a name="line.108"></a>
<FONT color="green">109</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.109"></a>
<FONT color="green">110</FONT>    <a name="line.110"></a>
<FONT color="green">111</FONT>            Set&lt;String&gt; namespaces = new LinkedHashSet&lt;String&gt;();<a name="line.111"></a>
<FONT color="green">112</FONT>    <a name="line.112"></a>
<FONT color="green">113</FONT>            // TODO: this logic should be optional, particularly remembering we want to keep this code simple<a name="line.113"></a>
<FONT color="green">114</FONT>            //       it is located here to avoid the content repository implementation needing to do too much for what<a name="line.114"></a>
<FONT color="green">115</FONT>            //       is essentially presentation code<a name="line.115"></a>
<FONT color="green">116</FONT>            Set&lt;String&gt; namespacesToCollapse;<a name="line.116"></a>
<FONT color="green">117</FONT>            RepositorySession repositorySession = repositorySessionFactory.createSession();<a name="line.117"></a>
<FONT color="green">118</FONT>            try<a name="line.118"></a>
<FONT color="green">119</FONT>            {<a name="line.119"></a>
<FONT color="green">120</FONT>                MetadataResolver metadataResolver = repositorySession.getResolver();<a name="line.120"></a>
<FONT color="green">121</FONT>                namespacesToCollapse = new LinkedHashSet&lt;String&gt;();<a name="line.121"></a>
<FONT color="green">122</FONT>    <a name="line.122"></a>
<FONT color="green">123</FONT>                for ( String repoId : selectedRepos )<a name="line.123"></a>
<FONT color="green">124</FONT>                {<a name="line.124"></a>
<FONT color="green">125</FONT>                    namespacesToCollapse.addAll( metadataResolver.resolveRootNamespaces( repositorySession, repoId ) );<a name="line.125"></a>
<FONT color="green">126</FONT>                }<a name="line.126"></a>
<FONT color="green">127</FONT>                for ( String n : namespacesToCollapse )<a name="line.127"></a>
<FONT color="green">128</FONT>                {<a name="line.128"></a>
<FONT color="green">129</FONT>                    // TODO: check performance of this<a name="line.129"></a>
<FONT color="green">130</FONT>                    namespaces.add( collapseNamespaces( repositorySession, metadataResolver, selectedRepos, n ) );<a name="line.130"></a>
<FONT color="green">131</FONT>                }<a name="line.131"></a>
<FONT color="green">132</FONT>            }<a name="line.132"></a>
<FONT color="green">133</FONT>            catch ( MetadataResolutionException e )<a name="line.133"></a>
<FONT color="green">134</FONT>            {<a name="line.134"></a>
<FONT color="green">135</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.135"></a>
<FONT color="green">136</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.136"></a>
<FONT color="green">137</FONT>            }<a name="line.137"></a>
<FONT color="green">138</FONT>            finally<a name="line.138"></a>
<FONT color="green">139</FONT>            {<a name="line.139"></a>
<FONT color="green">140</FONT>                repositorySession.close();<a name="line.140"></a>
<FONT color="green">141</FONT>            }<a name="line.141"></a>
<FONT color="green">142</FONT>    <a name="line.142"></a>
<FONT color="green">143</FONT>            List&lt;BrowseResultEntry&gt; browseGroupResultEntries = new ArrayList&lt;BrowseResultEntry&gt;( namespaces.size() );<a name="line.143"></a>
<FONT color="green">144</FONT>            for ( String namespace : namespaces )<a name="line.144"></a>
<FONT color="green">145</FONT>            {<a name="line.145"></a>
<FONT color="green">146</FONT>                browseGroupResultEntries.add( new BrowseResultEntry( namespace, false ) );<a name="line.146"></a>
<FONT color="green">147</FONT>            }<a name="line.147"></a>
<FONT color="green">148</FONT>    <a name="line.148"></a>
<FONT color="green">149</FONT>            Collections.sort( browseGroupResultEntries );<a name="line.149"></a>
<FONT color="green">150</FONT>            return new BrowseResult( browseGroupResultEntries );<a name="line.150"></a>
<FONT color="green">151</FONT>        }<a name="line.151"></a>
<FONT color="green">152</FONT>    <a name="line.152"></a>
<FONT color="green">153</FONT>        public BrowseResult browseGroupId( String groupId, String repositoryId )<a name="line.153"></a>
<FONT color="green">154</FONT>            throws ArchivaRestServiceException<a name="line.154"></a>
<FONT color="green">155</FONT>        {<a name="line.155"></a>
<FONT color="green">156</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.156"></a>
<FONT color="green">157</FONT>    <a name="line.157"></a>
<FONT color="green">158</FONT>            Set&lt;String&gt; projects = new LinkedHashSet&lt;String&gt;();<a name="line.158"></a>
<FONT color="green">159</FONT>    <a name="line.159"></a>
<FONT color="green">160</FONT>            RepositorySession repositorySession = repositorySessionFactory.createSession();<a name="line.160"></a>
<FONT color="green">161</FONT>            Set&lt;String&gt; namespaces;<a name="line.161"></a>
<FONT color="green">162</FONT>            try<a name="line.162"></a>
<FONT color="green">163</FONT>            {<a name="line.163"></a>
<FONT color="green">164</FONT>                MetadataResolver metadataResolver = repositorySession.getResolver();<a name="line.164"></a>
<FONT color="green">165</FONT>    <a name="line.165"></a>
<FONT color="green">166</FONT>                Set&lt;String&gt; namespacesToCollapse = new LinkedHashSet&lt;String&gt;();<a name="line.166"></a>
<FONT color="green">167</FONT>                for ( String repoId : selectedRepos )<a name="line.167"></a>
<FONT color="green">168</FONT>                {<a name="line.168"></a>
<FONT color="green">169</FONT>                    namespacesToCollapse.addAll( metadataResolver.resolveNamespaces( repositorySession, repoId, groupId ) );<a name="line.169"></a>
<FONT color="green">170</FONT>    <a name="line.170"></a>
<FONT color="green">171</FONT>                    projects.addAll( metadataResolver.resolveProjects( repositorySession, repoId, groupId ) );<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>                // TODO: this logic should be optional, particularly remembering we want to keep this code simple<a name="line.174"></a>
<FONT color="green">175</FONT>                // it is located here to avoid the content repository implementation needing to do too much for what<a name="line.175"></a>
<FONT color="green">176</FONT>                // is essentially presentation code<a name="line.176"></a>
<FONT color="green">177</FONT>                namespaces = new LinkedHashSet&lt;String&gt;();<a name="line.177"></a>
<FONT color="green">178</FONT>                for ( String n : namespacesToCollapse )<a name="line.178"></a>
<FONT color="green">179</FONT>                {<a name="line.179"></a>
<FONT color="green">180</FONT>                    // TODO: check performance of this<a name="line.180"></a>
<FONT color="green">181</FONT>                    namespaces.add(<a name="line.181"></a>
<FONT color="green">182</FONT>                        collapseNamespaces( repositorySession, metadataResolver, selectedRepos, groupId + "." + n ) );<a name="line.182"></a>
<FONT color="green">183</FONT>                }<a name="line.183"></a>
<FONT color="green">184</FONT>            }<a name="line.184"></a>
<FONT color="green">185</FONT>            catch ( MetadataResolutionException e )<a name="line.185"></a>
<FONT color="green">186</FONT>            {<a name="line.186"></a>
<FONT color="green">187</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.187"></a>
<FONT color="green">188</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.188"></a>
<FONT color="green">189</FONT>            }<a name="line.189"></a>
<FONT color="green">190</FONT>            finally<a name="line.190"></a>
<FONT color="green">191</FONT>            {<a name="line.191"></a>
<FONT color="green">192</FONT>                repositorySession.close();<a name="line.192"></a>
<FONT color="green">193</FONT>            }<a name="line.193"></a>
<FONT color="green">194</FONT>            List&lt;BrowseResultEntry&gt; browseGroupResultEntries =<a name="line.194"></a>
<FONT color="green">195</FONT>                new ArrayList&lt;BrowseResultEntry&gt;( namespaces.size() + projects.size() );<a name="line.195"></a>
<FONT color="green">196</FONT>            for ( String namespace : namespaces )<a name="line.196"></a>
<FONT color="green">197</FONT>            {<a name="line.197"></a>
<FONT color="green">198</FONT>                browseGroupResultEntries.add( new BrowseResultEntry( namespace, false ) );<a name="line.198"></a>
<FONT color="green">199</FONT>            }<a name="line.199"></a>
<FONT color="green">200</FONT>            for ( String project : projects )<a name="line.200"></a>
<FONT color="green">201</FONT>            {<a name="line.201"></a>
<FONT color="green">202</FONT>                browseGroupResultEntries.add( new BrowseResultEntry( groupId + '.' + project, true ) );<a name="line.202"></a>
<FONT color="green">203</FONT>            }<a name="line.203"></a>
<FONT color="green">204</FONT>            Collections.sort( browseGroupResultEntries );<a name="line.204"></a>
<FONT color="green">205</FONT>            return new BrowseResult( browseGroupResultEntries );<a name="line.205"></a>
<FONT color="green">206</FONT>    <a name="line.206"></a>
<FONT color="green">207</FONT>        }<a name="line.207"></a>
<FONT color="green">208</FONT>    <a name="line.208"></a>
<FONT color="green">209</FONT>        public VersionsList getVersionsList( String groupId, String artifactId, String repositoryId )<a name="line.209"></a>
<FONT color="green">210</FONT>            throws ArchivaRestServiceException<a name="line.210"></a>
<FONT color="green">211</FONT>        {<a name="line.211"></a>
<FONT color="green">212</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.212"></a>
<FONT color="green">213</FONT>    <a name="line.213"></a>
<FONT color="green">214</FONT>            try<a name="line.214"></a>
<FONT color="green">215</FONT>            {<a name="line.215"></a>
<FONT color="green">216</FONT>                Collection&lt;String&gt; versions = getVersions( selectedRepos, groupId, artifactId );<a name="line.216"></a>
<FONT color="green">217</FONT>                return new VersionsList( new ArrayList&lt;String&gt;( versions ) );<a name="line.217"></a>
<FONT color="green">218</FONT>            }<a name="line.218"></a>
<FONT color="green">219</FONT>            catch ( MetadataResolutionException e )<a name="line.219"></a>
<FONT color="green">220</FONT>            {<a name="line.220"></a>
<FONT color="green">221</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.221"></a>
<FONT color="green">222</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<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>        }<a name="line.225"></a>
<FONT color="green">226</FONT>    <a name="line.226"></a>
<FONT color="green">227</FONT>        private Collection&lt;String&gt; getVersions( List&lt;String&gt; selectedRepos, String groupId, String artifactId )<a name="line.227"></a>
<FONT color="green">228</FONT>            throws MetadataResolutionException<a name="line.228"></a>
<FONT color="green">229</FONT>    <a name="line.229"></a>
<FONT color="green">230</FONT>        {<a name="line.230"></a>
<FONT color="green">231</FONT>            RepositorySession repositorySession = repositorySessionFactory.createSession();<a name="line.231"></a>
<FONT color="green">232</FONT>            try<a name="line.232"></a>
<FONT color="green">233</FONT>            {<a name="line.233"></a>
<FONT color="green">234</FONT>                MetadataResolver metadataResolver = repositorySession.getResolver();<a name="line.234"></a>
<FONT color="green">235</FONT>    <a name="line.235"></a>
<FONT color="green">236</FONT>                Set&lt;String&gt; versions = new LinkedHashSet&lt;String&gt;();<a name="line.236"></a>
<FONT color="green">237</FONT>    <a name="line.237"></a>
<FONT color="green">238</FONT>                for ( String repoId : selectedRepos )<a name="line.238"></a>
<FONT color="green">239</FONT>                {<a name="line.239"></a>
<FONT color="green">240</FONT>                    Collection&lt;String&gt; projectVersions =<a name="line.240"></a>
<FONT color="green">241</FONT>                        metadataResolver.resolveProjectVersions( repositorySession, repoId, groupId, artifactId );<a name="line.241"></a>
<FONT color="green">242</FONT>                    versions.addAll( projectVersions );<a name="line.242"></a>
<FONT color="green">243</FONT>                }<a name="line.243"></a>
<FONT color="green">244</FONT>    <a name="line.244"></a>
<FONT color="green">245</FONT>                List&lt;String&gt; sortedVersions = new ArrayList&lt;String&gt;( versions );<a name="line.245"></a>
<FONT color="green">246</FONT>    <a name="line.246"></a>
<FONT color="green">247</FONT>                Collections.sort( sortedVersions, VersionComparator.getInstance() );<a name="line.247"></a>
<FONT color="green">248</FONT>    <a name="line.248"></a>
<FONT color="green">249</FONT>                return sortedVersions;<a name="line.249"></a>
<FONT color="green">250</FONT>            }<a name="line.250"></a>
<FONT color="green">251</FONT>            finally<a name="line.251"></a>
<FONT color="green">252</FONT>            {<a name="line.252"></a>
<FONT color="green">253</FONT>                repositorySession.close();<a name="line.253"></a>
<FONT color="green">254</FONT>            }<a name="line.254"></a>
<FONT color="green">255</FONT>        }<a name="line.255"></a>
<FONT color="green">256</FONT>    <a name="line.256"></a>
<FONT color="green">257</FONT>        public ProjectVersionMetadata getProjectMetadata( String groupId, String artifactId, String version,<a name="line.257"></a>
<FONT color="green">258</FONT>                                                          String repositoryId )<a name="line.258"></a>
<FONT color="green">259</FONT>            throws ArchivaRestServiceException<a name="line.259"></a>
<FONT color="green">260</FONT>        {<a name="line.260"></a>
<FONT color="green">261</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.261"></a>
<FONT color="green">262</FONT>    <a name="line.262"></a>
<FONT color="green">263</FONT>            RepositorySession repositorySession = null;<a name="line.263"></a>
<FONT color="green">264</FONT>            try<a name="line.264"></a>
<FONT color="green">265</FONT>            {<a name="line.265"></a>
<FONT color="green">266</FONT>                repositorySession = repositorySessionFactory.createSession();<a name="line.266"></a>
<FONT color="green">267</FONT>    <a name="line.267"></a>
<FONT color="green">268</FONT>                MetadataResolver metadataResolver = repositorySession.getResolver();<a name="line.268"></a>
<FONT color="green">269</FONT>    <a name="line.269"></a>
<FONT color="green">270</FONT>                ProjectVersionMetadata versionMetadata = null;<a name="line.270"></a>
<FONT color="green">271</FONT>                for ( String repoId : selectedRepos )<a name="line.271"></a>
<FONT color="green">272</FONT>                {<a name="line.272"></a>
<FONT color="green">273</FONT>                    if ( versionMetadata == null || versionMetadata.isIncomplete() )<a name="line.273"></a>
<FONT color="green">274</FONT>                    {<a name="line.274"></a>
<FONT color="green">275</FONT>                        try<a name="line.275"></a>
<FONT color="green">276</FONT>                        {<a name="line.276"></a>
<FONT color="green">277</FONT>                            versionMetadata =<a name="line.277"></a>
<FONT color="green">278</FONT>                                metadataResolver.resolveProjectVersion( repositorySession, repoId, groupId, artifactId,<a name="line.278"></a>
<FONT color="green">279</FONT>                                                                        version );<a name="line.279"></a>
<FONT color="green">280</FONT>                        }<a name="line.280"></a>
<FONT color="green">281</FONT>                        catch ( MetadataResolutionException e )<a name="line.281"></a>
<FONT color="green">282</FONT>                        {<a name="line.282"></a>
<FONT color="green">283</FONT>                            log.warn(<a name="line.283"></a>
<FONT color="green">284</FONT>                                "Skipping invalid metadata while compiling shared model for " + groupId + ":" + artifactId<a name="line.284"></a>
<FONT color="green">285</FONT>                                    + " in repo " + repoId + ": " + e.getMessage() );<a name="line.285"></a>
<FONT color="green">286</FONT>                        }<a name="line.286"></a>
<FONT color="green">287</FONT>                    }<a name="line.287"></a>
<FONT color="green">288</FONT>                }<a name="line.288"></a>
<FONT color="green">289</FONT>    <a name="line.289"></a>
<FONT color="green">290</FONT>                return versionMetadata;<a name="line.290"></a>
<FONT color="green">291</FONT>            }<a name="line.291"></a>
<FONT color="green">292</FONT>            finally<a name="line.292"></a>
<FONT color="green">293</FONT>            {<a name="line.293"></a>
<FONT color="green">294</FONT>                if ( repositorySession != null )<a name="line.294"></a>
<FONT color="green">295</FONT>                {<a name="line.295"></a>
<FONT color="green">296</FONT>                    repositorySession.close();<a name="line.296"></a>
<FONT color="green">297</FONT>                }<a name="line.297"></a>
<FONT color="green">298</FONT>            }<a name="line.298"></a>
<FONT color="green">299</FONT>    <a name="line.299"></a>
<FONT color="green">300</FONT>        }<a name="line.300"></a>
<FONT color="green">301</FONT>    <a name="line.301"></a>
<FONT color="green">302</FONT>        public ProjectVersionMetadata getProjectVersionMetadata( String groupId, String artifactId, String repositoryId )<a name="line.302"></a>
<FONT color="green">303</FONT>            throws ArchivaRestServiceException<a name="line.303"></a>
<FONT color="green">304</FONT>        {<a name="line.304"></a>
<FONT color="green">305</FONT>    <a name="line.305"></a>
<FONT color="green">306</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.306"></a>
<FONT color="green">307</FONT>    <a name="line.307"></a>
<FONT color="green">308</FONT>            RepositorySession repositorySession = null;<a name="line.308"></a>
<FONT color="green">309</FONT>            try<a name="line.309"></a>
<FONT color="green">310</FONT>            {<a name="line.310"></a>
<FONT color="green">311</FONT>    <a name="line.311"></a>
<FONT color="green">312</FONT>                Collection&lt;String&gt; projectVersions = getVersions( selectedRepos, groupId, artifactId );<a name="line.312"></a>
<FONT color="green">313</FONT>    <a name="line.313"></a>
<FONT color="green">314</FONT>                repositorySession = repositorySessionFactory.createSession();<a name="line.314"></a>
<FONT color="green">315</FONT>    <a name="line.315"></a>
<FONT color="green">316</FONT>                MetadataResolver metadataResolver = repositorySession.getResolver();<a name="line.316"></a>
<FONT color="green">317</FONT>    <a name="line.317"></a>
<FONT color="green">318</FONT>                ProjectVersionMetadata sharedModel = new ProjectVersionMetadata();<a name="line.318"></a>
<FONT color="green">319</FONT>    <a name="line.319"></a>
<FONT color="green">320</FONT>                MavenProjectFacet mavenFacet = new MavenProjectFacet();<a name="line.320"></a>
<FONT color="green">321</FONT>                mavenFacet.setGroupId( groupId );<a name="line.321"></a>
<FONT color="green">322</FONT>                mavenFacet.setArtifactId( artifactId );<a name="line.322"></a>
<FONT color="green">323</FONT>                sharedModel.addFacet( mavenFacet );<a name="line.323"></a>
<FONT color="green">324</FONT>    <a name="line.324"></a>
<FONT color="green">325</FONT>                boolean isFirstVersion = true;<a name="line.325"></a>
<FONT color="green">326</FONT>    <a name="line.326"></a>
<FONT color="green">327</FONT>                for ( String version : projectVersions )<a name="line.327"></a>
<FONT color="green">328</FONT>                {<a name="line.328"></a>
<FONT color="green">329</FONT>                    ProjectVersionMetadata versionMetadata = null;<a name="line.329"></a>
<FONT color="green">330</FONT>                    for ( String repoId : selectedRepos )<a name="line.330"></a>
<FONT color="green">331</FONT>                    {<a name="line.331"></a>
<FONT color="green">332</FONT>                        if ( versionMetadata == null || versionMetadata.isIncomplete() )<a name="line.332"></a>
<FONT color="green">333</FONT>                        {<a name="line.333"></a>
<FONT color="green">334</FONT>                            try<a name="line.334"></a>
<FONT color="green">335</FONT>                            {<a name="line.335"></a>
<FONT color="green">336</FONT>                                versionMetadata =<a name="line.336"></a>
<FONT color="green">337</FONT>                                    metadataResolver.resolveProjectVersion( repositorySession, repoId, groupId, artifactId,<a name="line.337"></a>
<FONT color="green">338</FONT>                                                                            version );<a name="line.338"></a>
<FONT color="green">339</FONT>                            }<a name="line.339"></a>
<FONT color="green">340</FONT>                            catch ( MetadataResolutionException e )<a name="line.340"></a>
<FONT color="green">341</FONT>                            {<a name="line.341"></a>
<FONT color="green">342</FONT>                                log.error( "Skipping invalid metadata while compiling shared model for " + groupId + ":"<a name="line.342"></a>
<FONT color="green">343</FONT>                                               + artifactId + " in repo " + repoId + ": " + e.getMessage() );<a name="line.343"></a>
<FONT color="green">344</FONT>                            }<a name="line.344"></a>
<FONT color="green">345</FONT>                        }<a name="line.345"></a>
<FONT color="green">346</FONT>                    }<a name="line.346"></a>
<FONT color="green">347</FONT>    <a name="line.347"></a>
<FONT color="green">348</FONT>                    if ( versionMetadata == null )<a name="line.348"></a>
<FONT color="green">349</FONT>                    {<a name="line.349"></a>
<FONT color="green">350</FONT>                        continue;<a name="line.350"></a>
<FONT color="green">351</FONT>                    }<a name="line.351"></a>
<FONT color="green">352</FONT>    <a name="line.352"></a>
<FONT color="green">353</FONT>                    if ( isFirstVersion )<a name="line.353"></a>
<FONT color="green">354</FONT>                    {<a name="line.354"></a>
<FONT color="green">355</FONT>                        sharedModel = versionMetadata;<a name="line.355"></a>
<FONT color="green">356</FONT>                        sharedModel.setId( null );<a name="line.356"></a>
<FONT color="green">357</FONT>                    }<a name="line.357"></a>
<FONT color="green">358</FONT>                    else<a name="line.358"></a>
<FONT color="green">359</FONT>                    {<a name="line.359"></a>
<FONT color="green">360</FONT>                        MavenProjectFacet versionMetadataMavenFacet =<a name="line.360"></a>
<FONT color="green">361</FONT>                            (MavenProjectFacet) versionMetadata.getFacet( MavenProjectFacet.FACET_ID );<a name="line.361"></a>
<FONT color="green">362</FONT>                        if ( versionMetadataMavenFacet != null )<a name="line.362"></a>
<FONT color="green">363</FONT>                        {<a name="line.363"></a>
<FONT color="green">364</FONT>                            if ( mavenFacet.getPackaging() != null &amp;&amp; !StringUtils.equalsIgnoreCase(<a name="line.364"></a>
<FONT color="green">365</FONT>                                mavenFacet.getPackaging(), versionMetadataMavenFacet.getPackaging() ) )<a name="line.365"></a>
<FONT color="green">366</FONT>                            {<a name="line.366"></a>
<FONT color="green">367</FONT>                                mavenFacet.setPackaging( null );<a name="line.367"></a>
<FONT color="green">368</FONT>                            }<a name="line.368"></a>
<FONT color="green">369</FONT>                        }<a name="line.369"></a>
<FONT color="green">370</FONT>    <a name="line.370"></a>
<FONT color="green">371</FONT>                        if ( StringUtils.isEmpty( sharedModel.getName() ) &amp;&amp; !StringUtils.isEmpty(<a name="line.371"></a>
<FONT color="green">372</FONT>                            versionMetadata.getName() ) )<a name="line.372"></a>
<FONT color="green">373</FONT>                        {<a name="line.373"></a>
<FONT color="green">374</FONT>                            sharedModel.setName( versionMetadata.getName() );<a name="line.374"></a>
<FONT color="green">375</FONT>                        }<a name="line.375"></a>
<FONT color="green">376</FONT>    <a name="line.376"></a>
<FONT color="green">377</FONT>                        if ( sharedModel.getDescription() != null &amp;&amp; !StringUtils.equalsIgnoreCase(<a name="line.377"></a>
<FONT color="green">378</FONT>                            sharedModel.getDescription(), versionMetadata.getDescription() ) )<a name="line.378"></a>
<FONT color="green">379</FONT>                        {<a name="line.379"></a>
<FONT color="green">380</FONT>                            sharedModel.setDescription( StringUtils.isNotEmpty( versionMetadata.getDescription() )<a name="line.380"></a>
<FONT color="green">381</FONT>                                                            ? versionMetadata.getDescription()<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>    <a name="line.384"></a>
<FONT color="green">385</FONT>                        if ( sharedModel.getIssueManagement() != null &amp;&amp; versionMetadata.getIssueManagement() != null<a name="line.385"></a>
<FONT color="green">386</FONT>                            &amp;&amp; !StringUtils.equalsIgnoreCase( sharedModel.getIssueManagement().getUrl(),<a name="line.386"></a>
<FONT color="green">387</FONT>                                                              versionMetadata.getIssueManagement().getUrl() ) )<a name="line.387"></a>
<FONT color="green">388</FONT>                        {<a name="line.388"></a>
<FONT color="green">389</FONT>                            sharedModel.setIssueManagement( versionMetadata.getIssueManagement() );<a name="line.389"></a>
<FONT color="green">390</FONT>                        }<a name="line.390"></a>
<FONT color="green">391</FONT>    <a name="line.391"></a>
<FONT color="green">392</FONT>                        if ( sharedModel.getCiManagement() != null &amp;&amp; versionMetadata.getCiManagement() != null<a name="line.392"></a>
<FONT color="green">393</FONT>                            &amp;&amp; !StringUtils.equalsIgnoreCase( sharedModel.getCiManagement().getUrl(),<a name="line.393"></a>
<FONT color="green">394</FONT>                                                              versionMetadata.getCiManagement().getUrl() ) )<a name="line.394"></a>
<FONT color="green">395</FONT>                        {<a name="line.395"></a>
<FONT color="green">396</FONT>                            sharedModel.setCiManagement( versionMetadata.getCiManagement() );<a name="line.396"></a>
<FONT color="green">397</FONT>                        }<a name="line.397"></a>
<FONT color="green">398</FONT>    <a name="line.398"></a>
<FONT color="green">399</FONT>                        if ( sharedModel.getOrganization() != null &amp;&amp; versionMetadata.getOrganization() != null<a name="line.399"></a>
<FONT color="green">400</FONT>                            &amp;&amp; !StringUtils.equalsIgnoreCase( sharedModel.getOrganization().getName(),<a name="line.400"></a>
<FONT color="green">401</FONT>                                                              versionMetadata.getOrganization().getName() ) )<a name="line.401"></a>
<FONT color="green">402</FONT>                        {<a name="line.402"></a>
<FONT color="green">403</FONT>                            sharedModel.setOrganization( versionMetadata.getOrganization() );<a name="line.403"></a>
<FONT color="green">404</FONT>                        }<a name="line.404"></a>
<FONT color="green">405</FONT>    <a name="line.405"></a>
<FONT color="green">406</FONT>                        if ( sharedModel.getUrl() != null &amp;&amp; !StringUtils.equalsIgnoreCase( sharedModel.getUrl(),<a name="line.406"></a>
<FONT color="green">407</FONT>                                                                                            versionMetadata.getUrl() ) )<a name="line.407"></a>
<FONT color="green">408</FONT>                        {<a name="line.408"></a>
<FONT color="green">409</FONT>                            sharedModel.setUrl( versionMetadata.getUrl() );<a name="line.409"></a>
<FONT color="green">410</FONT>                        }<a name="line.410"></a>
<FONT color="green">411</FONT>                    }<a name="line.411"></a>
<FONT color="green">412</FONT>    <a name="line.412"></a>
<FONT color="green">413</FONT>                    isFirstVersion = false;<a name="line.413"></a>
<FONT color="green">414</FONT>                }<a name="line.414"></a>
<FONT color="green">415</FONT>                return sharedModel;<a name="line.415"></a>
<FONT color="green">416</FONT>            }<a name="line.416"></a>
<FONT color="green">417</FONT>            catch ( MetadataResolutionException e )<a name="line.417"></a>
<FONT color="green">418</FONT>            {<a name="line.418"></a>
<FONT color="green">419</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.419"></a>
<FONT color="green">420</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.420"></a>
<FONT color="green">421</FONT>            }<a name="line.421"></a>
<FONT color="green">422</FONT>            finally<a name="line.422"></a>
<FONT color="green">423</FONT>            {<a name="line.423"></a>
<FONT color="green">424</FONT>                if ( repositorySession != null )<a name="line.424"></a>
<FONT color="green">425</FONT>                {<a name="line.425"></a>
<FONT color="green">426</FONT>                    repositorySession.close();<a name="line.426"></a>
<FONT color="green">427</FONT>                }<a name="line.427"></a>
<FONT color="green">428</FONT>            }<a name="line.428"></a>
<FONT color="green">429</FONT>        }<a name="line.429"></a>
<FONT color="green">430</FONT>    <a name="line.430"></a>
<FONT color="green">431</FONT>        public List&lt;TreeEntry&gt; getTreeEntries( String groupId, String artifactId, String version, String repositoryId )<a name="line.431"></a>
<FONT color="green">432</FONT>            throws ArchivaRestServiceException<a name="line.432"></a>
<FONT color="green">433</FONT>        {<a name="line.433"></a>
<FONT color="green">434</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.434"></a>
<FONT color="green">435</FONT>    <a name="line.435"></a>
<FONT color="green">436</FONT>            try<a name="line.436"></a>
<FONT color="green">437</FONT>            {<a name="line.437"></a>
<FONT color="green">438</FONT>    <a name="line.438"></a>
<FONT color="green">439</FONT>                return dependencyTreeBuilder.buildDependencyTree( selectedRepos, groupId, artifactId, version );<a name="line.439"></a>
<FONT color="green">440</FONT>    <a name="line.440"></a>
<FONT color="green">441</FONT>            }<a name="line.441"></a>
<FONT color="green">442</FONT>            catch ( Exception e )<a name="line.442"></a>
<FONT color="green">443</FONT>            {<a name="line.443"></a>
<FONT color="green">444</FONT>                log.error( e.getMessage(), e );<a name="line.444"></a>
<FONT color="green">445</FONT>            }<a name="line.445"></a>
<FONT color="green">446</FONT>    <a name="line.446"></a>
<FONT color="green">447</FONT>            return Collections.emptyList();<a name="line.447"></a>
<FONT color="green">448</FONT>        }<a name="line.448"></a>
<FONT color="green">449</FONT>    <a name="line.449"></a>
<FONT color="green">450</FONT>        public List&lt;ManagedRepository&gt; getUserRepositories()<a name="line.450"></a>
<FONT color="green">451</FONT>            throws ArchivaRestServiceException<a name="line.451"></a>
<FONT color="green">452</FONT>        {<a name="line.452"></a>
<FONT color="green">453</FONT>            try<a name="line.453"></a>
<FONT color="green">454</FONT>            {<a name="line.454"></a>
<FONT color="green">455</FONT>                return userRepositories.getAccessibleRepositories( getPrincipal() );<a name="line.455"></a>
<FONT color="green">456</FONT>            }<a name="line.456"></a>
<FONT color="green">457</FONT>            catch ( ArchivaSecurityException e )<a name="line.457"></a>
<FONT color="green">458</FONT>            {<a name="line.458"></a>
<FONT color="green">459</FONT>                throw new ArchivaRestServiceException( "repositories.read.observable.error",<a name="line.459"></a>
<FONT color="green">460</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.460"></a>
<FONT color="green">461</FONT>            }<a name="line.461"></a>
<FONT color="green">462</FONT>        }<a name="line.462"></a>
<FONT color="green">463</FONT>    <a name="line.463"></a>
<FONT color="green">464</FONT>        public List&lt;Artifact&gt; getDependees( String groupId, String artifactId, String version, String repositoryId )<a name="line.464"></a>
<FONT color="green">465</FONT>            throws ArchivaRestServiceException<a name="line.465"></a>
<FONT color="green">466</FONT>        {<a name="line.466"></a>
<FONT color="green">467</FONT>            List&lt;ProjectVersionReference&gt; references = new ArrayList&lt;ProjectVersionReference&gt;();<a name="line.467"></a>
<FONT color="green">468</FONT>            // TODO: what if we get duplicates across repositories?<a name="line.468"></a>
<FONT color="green">469</FONT>            RepositorySession repositorySession = repositorySessionFactory.createSession();<a name="line.469"></a>
<FONT color="green">470</FONT>            try<a name="line.470"></a>
<FONT color="green">471</FONT>            {<a name="line.471"></a>
<FONT color="green">472</FONT>                MetadataResolver metadataResolver = repositorySession.getResolver();<a name="line.472"></a>
<FONT color="green">473</FONT>                for ( String repoId : getObservableRepos() )<a name="line.473"></a>
<FONT color="green">474</FONT>                {<a name="line.474"></a>
<FONT color="green">475</FONT>                    // TODO: what about if we want to see this irrespective of version?<a name="line.475"></a>
<FONT color="green">476</FONT>                    references.addAll(<a name="line.476"></a>
<FONT color="green">477</FONT>                        metadataResolver.resolveProjectReferences( repositorySession, repoId, groupId, artifactId,<a name="line.477"></a>
<FONT color="green">478</FONT>                                                                   version ) );<a name="line.478"></a>
<FONT color="green">479</FONT>                }<a name="line.479"></a>
<FONT color="green">480</FONT>            }<a name="line.480"></a>
<FONT color="green">481</FONT>            catch ( MetadataResolutionException e )<a name="line.481"></a>
<FONT color="green">482</FONT>            {<a name="line.482"></a>
<FONT color="green">483</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.483"></a>
<FONT color="green">484</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.484"></a>
<FONT color="green">485</FONT>            }<a name="line.485"></a>
<FONT color="green">486</FONT>            finally<a name="line.486"></a>
<FONT color="green">487</FONT>            {<a name="line.487"></a>
<FONT color="green">488</FONT>                repositorySession.close();<a name="line.488"></a>
<FONT color="green">489</FONT>            }<a name="line.489"></a>
<FONT color="green">490</FONT>    <a name="line.490"></a>
<FONT color="green">491</FONT>            List&lt;Artifact&gt; artifacts = new ArrayList&lt;Artifact&gt;( references.size() );<a name="line.491"></a>
<FONT color="green">492</FONT>    <a name="line.492"></a>
<FONT color="green">493</FONT>            for ( ProjectVersionReference projectVersionReference : references )<a name="line.493"></a>
<FONT color="green">494</FONT>            {<a name="line.494"></a>
<FONT color="green">495</FONT>                artifacts.add( new Artifact( projectVersionReference.getNamespace(), projectVersionReference.getProjectId(),<a name="line.495"></a>
<FONT color="green">496</FONT>                                             projectVersionReference.getProjectVersion() ) );<a name="line.496"></a>
<FONT color="green">497</FONT>            }<a name="line.497"></a>
<FONT color="green">498</FONT>            return artifacts;<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>        public List&lt;Entry&gt; getMetadatas( String groupId, String artifactId, String version, String repositoryId )<a name="line.501"></a>
<FONT color="green">502</FONT>            throws ArchivaRestServiceException<a name="line.502"></a>
<FONT color="green">503</FONT>        {<a name="line.503"></a>
<FONT color="green">504</FONT>            ProjectVersionMetadata projectVersionMetadata =<a name="line.504"></a>
<FONT color="green">505</FONT>                getProjectMetadata( groupId, artifactId, version, repositoryId );<a name="line.505"></a>
<FONT color="green">506</FONT>            if ( projectVersionMetadata == null )<a name="line.506"></a>
<FONT color="green">507</FONT>            {<a name="line.507"></a>
<FONT color="green">508</FONT>                return Collections.emptyList();<a name="line.508"></a>
<FONT color="green">509</FONT>            }<a name="line.509"></a>
<FONT color="green">510</FONT>            MetadataFacet metadataFacet = projectVersionMetadata.getFacet( GenericMetadataFacet.FACET_ID );<a name="line.510"></a>
<FONT color="green">511</FONT>    <a name="line.511"></a>
<FONT color="green">512</FONT>            if ( metadataFacet == null )<a name="line.512"></a>
<FONT color="green">513</FONT>            {<a name="line.513"></a>
<FONT color="green">514</FONT>                return Collections.emptyList();<a name="line.514"></a>
<FONT color="green">515</FONT>            }<a name="line.515"></a>
<FONT color="green">516</FONT>            Map&lt;String, String&gt; map = metadataFacet.toProperties();<a name="line.516"></a>
<FONT color="green">517</FONT>            List&lt;Entry&gt; entries = new ArrayList&lt;Entry&gt;( map.size() );<a name="line.517"></a>
<FONT color="green">518</FONT>    <a name="line.518"></a>
<FONT color="green">519</FONT>            for ( Map.Entry&lt;String, String&gt; entry : map.entrySet() )<a name="line.519"></a>
<FONT color="green">520</FONT>            {<a name="line.520"></a>
<FONT color="green">521</FONT>                entries.add( new Entry( entry.getKey(), entry.getValue() ) );<a name="line.521"></a>
<FONT color="green">522</FONT>            }<a name="line.522"></a>
<FONT color="green">523</FONT>    <a name="line.523"></a>
<FONT color="green">524</FONT>            return entries;<a name="line.524"></a>
<FONT color="green">525</FONT>        }<a name="line.525"></a>
<FONT color="green">526</FONT>    <a name="line.526"></a>
<FONT color="green">527</FONT>        public Boolean addMetadata( String groupId, String artifactId, String version, String key, String value,<a name="line.527"></a>
<FONT color="green">528</FONT>                                    String repositoryId )<a name="line.528"></a>
<FONT color="green">529</FONT>            throws ArchivaRestServiceException<a name="line.529"></a>
<FONT color="green">530</FONT>        {<a name="line.530"></a>
<FONT color="green">531</FONT>            ProjectVersionMetadata projectVersionMetadata =<a name="line.531"></a>
<FONT color="green">532</FONT>                getProjectMetadata( groupId, artifactId, version, repositoryId );<a name="line.532"></a>
<FONT color="green">533</FONT>    <a name="line.533"></a>
<FONT color="green">534</FONT>            if ( projectVersionMetadata == null )<a name="line.534"></a>
<FONT color="green">535</FONT>            {<a name="line.535"></a>
<FONT color="green">536</FONT>                return Boolean.FALSE;<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>            Map&lt;String, String&gt; properties = new HashMap&lt;String, String&gt;();<a name="line.539"></a>
<FONT color="green">540</FONT>    <a name="line.540"></a>
<FONT color="green">541</FONT>            MetadataFacet metadataFacet = projectVersionMetadata.getFacet( GenericMetadataFacet.FACET_ID );<a name="line.541"></a>
<FONT color="green">542</FONT>    <a name="line.542"></a>
<FONT color="green">543</FONT>            if ( metadataFacet != null &amp;&amp; metadataFacet.toProperties() != null )<a name="line.543"></a>
<FONT color="green">544</FONT>            {<a name="line.544"></a>
<FONT color="green">545</FONT>                properties.putAll( metadataFacet.toProperties() );<a name="line.545"></a>
<FONT color="green">546</FONT>            }<a name="line.546"></a>
<FONT color="green">547</FONT>            else<a name="line.547"></a>
<FONT color="green">548</FONT>            {<a name="line.548"></a>
<FONT color="green">549</FONT>                metadataFacet = new GenericMetadataFacet();<a name="line.549"></a>
<FONT color="green">550</FONT>            }<a name="line.550"></a>
<FONT color="green">551</FONT>    <a name="line.551"></a>
<FONT color="green">552</FONT>            properties.put( key, value );<a name="line.552"></a>
<FONT color="green">553</FONT>    <a name="line.553"></a>
<FONT color="green">554</FONT>            metadataFacet.fromProperties( properties );<a name="line.554"></a>
<FONT color="green">555</FONT>    <a name="line.555"></a>
<FONT color="green">556</FONT>            projectVersionMetadata.addFacet( metadataFacet );<a name="line.556"></a>
<FONT color="green">557</FONT>    <a name="line.557"></a>
<FONT color="green">558</FONT>            RepositorySession repositorySession = repositorySessionFactory.createSession();<a name="line.558"></a>
<FONT color="green">559</FONT>    <a name="line.559"></a>
<FONT color="green">560</FONT>            try<a name="line.560"></a>
<FONT color="green">561</FONT>            {<a name="line.561"></a>
<FONT color="green">562</FONT>                MetadataRepository metadataRepository = repositorySession.getRepository();<a name="line.562"></a>
<FONT color="green">563</FONT>    <a name="line.563"></a>
<FONT color="green">564</FONT>                metadataRepository.updateProjectVersion( repositoryId, groupId, artifactId, projectVersionMetadata );<a name="line.564"></a>
<FONT color="green">565</FONT>    <a name="line.565"></a>
<FONT color="green">566</FONT>                repositorySession.save();<a name="line.566"></a>
<FONT color="green">567</FONT>            }<a name="line.567"></a>
<FONT color="green">568</FONT>            catch ( MetadataRepositoryException e )<a name="line.568"></a>
<FONT color="green">569</FONT>            {<a name="line.569"></a>
<FONT color="green">570</FONT>                log.error( e.getMessage(), e );<a name="line.570"></a>
<FONT color="green">571</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.571"></a>
<FONT color="green">572</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.572"></a>
<FONT color="green">573</FONT>            }<a name="line.573"></a>
<FONT color="green">574</FONT>            finally<a name="line.574"></a>
<FONT color="green">575</FONT>            {<a name="line.575"></a>
<FONT color="green">576</FONT>                repositorySession.close();<a name="line.576"></a>
<FONT color="green">577</FONT>            }<a name="line.577"></a>
<FONT color="green">578</FONT>            return Boolean.TRUE;<a name="line.578"></a>
<FONT color="green">579</FONT>        }<a name="line.579"></a>
<FONT color="green">580</FONT>    <a name="line.580"></a>
<FONT color="green">581</FONT>        public Boolean deleteMetadata( String groupId, String artifactId, String version, String key, String repositoryId )<a name="line.581"></a>
<FONT color="green">582</FONT>            throws ArchivaRestServiceException<a name="line.582"></a>
<FONT color="green">583</FONT>        {<a name="line.583"></a>
<FONT color="green">584</FONT>            ProjectVersionMetadata projectVersionMetadata =<a name="line.584"></a>
<FONT color="green">585</FONT>                getProjectMetadata( groupId, artifactId, version, repositoryId );<a name="line.585"></a>
<FONT color="green">586</FONT>    <a name="line.586"></a>
<FONT color="green">587</FONT>            if ( projectVersionMetadata == null )<a name="line.587"></a>
<FONT color="green">588</FONT>            {<a name="line.588"></a>
<FONT color="green">589</FONT>                return Boolean.FALSE;<a name="line.589"></a>
<FONT color="green">590</FONT>            }<a name="line.590"></a>
<FONT color="green">591</FONT>    <a name="line.591"></a>
<FONT color="green">592</FONT>            GenericMetadataFacet metadataFacet =<a name="line.592"></a>
<FONT color="green">593</FONT>                (GenericMetadataFacet) projectVersionMetadata.getFacet( GenericMetadataFacet.FACET_ID );<a name="line.593"></a>
<FONT color="green">594</FONT>    <a name="line.594"></a>
<FONT color="green">595</FONT>            if ( metadataFacet != null &amp;&amp; metadataFacet.toProperties() != null )<a name="line.595"></a>
<FONT color="green">596</FONT>            {<a name="line.596"></a>
<FONT color="green">597</FONT>                Map&lt;String, String&gt; properties = metadataFacet.toProperties();<a name="line.597"></a>
<FONT color="green">598</FONT>                properties.remove( key );<a name="line.598"></a>
<FONT color="green">599</FONT>                metadataFacet.setAdditionalProperties( properties );<a name="line.599"></a>
<FONT color="green">600</FONT>            }<a name="line.600"></a>
<FONT color="green">601</FONT>            else<a name="line.601"></a>
<FONT color="green">602</FONT>            {<a name="line.602"></a>
<FONT color="green">603</FONT>                return Boolean.TRUE;<a name="line.603"></a>
<FONT color="green">604</FONT>            }<a name="line.604"></a>
<FONT color="green">605</FONT>    <a name="line.605"></a>
<FONT color="green">606</FONT>            RepositorySession repositorySession = repositorySessionFactory.createSession();<a name="line.606"></a>
<FONT color="green">607</FONT>    <a name="line.607"></a>
<FONT color="green">608</FONT>            try<a name="line.608"></a>
<FONT color="green">609</FONT>            {<a name="line.609"></a>
<FONT color="green">610</FONT>                MetadataRepository metadataRepository = repositorySession.getRepository();<a name="line.610"></a>
<FONT color="green">611</FONT>    <a name="line.611"></a>
<FONT color="green">612</FONT>                metadataRepository.updateProjectVersion( repositoryId, groupId, artifactId, projectVersionMetadata );<a name="line.612"></a>
<FONT color="green">613</FONT>    <a name="line.613"></a>
<FONT color="green">614</FONT>                repositorySession.save();<a name="line.614"></a>
<FONT color="green">615</FONT>            }<a name="line.615"></a>
<FONT color="green">616</FONT>            catch ( MetadataRepositoryException e )<a name="line.616"></a>
<FONT color="green">617</FONT>            {<a name="line.617"></a>
<FONT color="green">618</FONT>                log.error( e.getMessage(), e );<a name="line.618"></a>
<FONT color="green">619</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.619"></a>
<FONT color="green">620</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.620"></a>
<FONT color="green">621</FONT>            }<a name="line.621"></a>
<FONT color="green">622</FONT>            finally<a name="line.622"></a>
<FONT color="green">623</FONT>            {<a name="line.623"></a>
<FONT color="green">624</FONT>                repositorySession.close();<a name="line.624"></a>
<FONT color="green">625</FONT>            }<a name="line.625"></a>
<FONT color="green">626</FONT>            return Boolean.TRUE;<a name="line.626"></a>
<FONT color="green">627</FONT>        }<a name="line.627"></a>
<FONT color="green">628</FONT>    <a name="line.628"></a>
<FONT color="green">629</FONT>        public List&lt;ArtifactContentEntry&gt; getArtifactContentEntries( String groupId, String artifactId, String version,<a name="line.629"></a>
<FONT color="green">630</FONT>                                                                     String classifier, String type, String path,<a name="line.630"></a>
<FONT color="green">631</FONT>                                                                     String repositoryId )<a name="line.631"></a>
<FONT color="green">632</FONT>            throws ArchivaRestServiceException<a name="line.632"></a>
<FONT color="green">633</FONT>        {<a name="line.633"></a>
<FONT color="green">634</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.634"></a>
<FONT color="green">635</FONT>            try<a name="line.635"></a>
<FONT color="green">636</FONT>            {<a name="line.636"></a>
<FONT color="green">637</FONT>                for ( String repoId : selectedRepos )<a name="line.637"></a>
<FONT color="green">638</FONT>                {<a name="line.638"></a>
<FONT color="green">639</FONT>    <a name="line.639"></a>
<FONT color="green">640</FONT>                    ManagedRepositoryContent managedRepositoryContent =<a name="line.640"></a>
<FONT color="green">641</FONT>                        repositoryContentFactory.getManagedRepositoryContent( repoId );<a name="line.641"></a>
<FONT color="green">642</FONT>                    ArchivaArtifact archivaArtifact = new ArchivaArtifact( groupId, artifactId, version, classifier,<a name="line.642"></a>
<FONT color="green">643</FONT>                                                                           StringUtils.isEmpty( type ) ? "jar" : type,<a name="line.643"></a>
<FONT color="green">644</FONT>                                                                           repoId );<a name="line.644"></a>
<FONT color="green">645</FONT>                    File file = managedRepositoryContent.toFile( archivaArtifact );<a name="line.645"></a>
<FONT color="green">646</FONT>                    if ( file.exists() )<a name="line.646"></a>
<FONT color="green">647</FONT>                    {<a name="line.647"></a>
<FONT color="green">648</FONT>                        return readFileEntries( file, path, repoId );<a name="line.648"></a>
<FONT color="green">649</FONT>                    }<a name="line.649"></a>
<FONT color="green">650</FONT>                }<a name="line.650"></a>
<FONT color="green">651</FONT>            }<a name="line.651"></a>
<FONT color="green">652</FONT>            catch ( IOException e )<a name="line.652"></a>
<FONT color="green">653</FONT>            {<a name="line.653"></a>
<FONT color="green">654</FONT>                log.error( e.getMessage(), e );<a name="line.654"></a>
<FONT color="green">655</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.655"></a>
<FONT color="green">656</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.656"></a>
<FONT color="green">657</FONT>            }<a name="line.657"></a>
<FONT color="green">658</FONT>            catch ( RepositoryNotFoundException e )<a name="line.658"></a>
<FONT color="green">659</FONT>            {<a name="line.659"></a>
<FONT color="green">660</FONT>                log.error( e.getMessage(), e );<a name="line.660"></a>
<FONT color="green">661</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.661"></a>
<FONT color="green">662</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.662"></a>
<FONT color="green">663</FONT>            }<a name="line.663"></a>
<FONT color="green">664</FONT>            catch ( RepositoryException e )<a name="line.664"></a>
<FONT color="green">665</FONT>            {<a name="line.665"></a>
<FONT color="green">666</FONT>                log.error( e.getMessage(), e );<a name="line.666"></a>
<FONT color="green">667</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.667"></a>
<FONT color="green">668</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.668"></a>
<FONT color="green">669</FONT>            }<a name="line.669"></a>
<FONT color="green">670</FONT>            return Collections.emptyList();<a name="line.670"></a>
<FONT color="green">671</FONT>        }<a name="line.671"></a>
<FONT color="green">672</FONT>    <a name="line.672"></a>
<FONT color="green">673</FONT>        public List&lt;Artifact&gt; getArtifactDownloadInfos( String groupId, String artifactId, String version,<a name="line.673"></a>
<FONT color="green">674</FONT>                                                        String repositoryId )<a name="line.674"></a>
<FONT color="green">675</FONT>            throws ArchivaRestServiceException<a name="line.675"></a>
<FONT color="green">676</FONT>        {<a name="line.676"></a>
<FONT color="green">677</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.677"></a>
<FONT color="green">678</FONT>    <a name="line.678"></a>
<FONT color="green">679</FONT>            List&lt;Artifact&gt; artifactDownloadInfos = new ArrayList&lt;Artifact&gt;();<a name="line.679"></a>
<FONT color="green">680</FONT>    <a name="line.680"></a>
<FONT color="green">681</FONT>            RepositorySession session = repositorySessionFactory.createSession();<a name="line.681"></a>
<FONT color="green">682</FONT>    <a name="line.682"></a>
<FONT color="green">683</FONT>            MetadataResolver metadataResolver = session.getResolver();<a name="line.683"></a>
<FONT color="green">684</FONT>    <a name="line.684"></a>
<FONT color="green">685</FONT>            try<a name="line.685"></a>
<FONT color="green">686</FONT>            {<a name="line.686"></a>
<FONT color="green">687</FONT>                for ( String repoId : selectedRepos )<a name="line.687"></a>
<FONT color="green">688</FONT>                {<a name="line.688"></a>
<FONT color="green">689</FONT>                    List&lt;ArtifactMetadata&gt; artifacts = new ArrayList&lt;ArtifactMetadata&gt;(<a name="line.689"></a>
<FONT color="green">690</FONT>                        metadataResolver.resolveArtifacts( session, repoId, groupId, artifactId, version ) );<a name="line.690"></a>
<FONT color="green">691</FONT>                    Collections.sort( artifacts, ArtifactMetadataVersionComparator.INSTANCE );<a name="line.691"></a>
<FONT color="green">692</FONT>                    if ( artifacts != null &amp;&amp; !artifacts.isEmpty() )<a name="line.692"></a>
<FONT color="green">693</FONT>                    {<a name="line.693"></a>
<FONT color="green">694</FONT>                        return buildArtifacts( artifacts, repoId );<a name="line.694"></a>
<FONT color="green">695</FONT>                    }<a name="line.695"></a>
<FONT color="green">696</FONT>                }<a name="line.696"></a>
<FONT color="green">697</FONT>            }<a name="line.697"></a>
<FONT color="green">698</FONT>            catch ( MetadataResolutionException e )<a name="line.698"></a>
<FONT color="green">699</FONT>            {<a name="line.699"></a>
<FONT color="green">700</FONT>                log.error( e.getMessage(), e );<a name="line.700"></a>
<FONT color="green">701</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.701"></a>
<FONT color="green">702</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.702"></a>
<FONT color="green">703</FONT>            }<a name="line.703"></a>
<FONT color="green">704</FONT>            finally<a name="line.704"></a>
<FONT color="green">705</FONT>            {<a name="line.705"></a>
<FONT color="green">706</FONT>                if ( session != null )<a name="line.706"></a>
<FONT color="green">707</FONT>                {<a name="line.707"></a>
<FONT color="green">708</FONT>                    session.closeQuietly();<a name="line.708"></a>
<FONT color="green">709</FONT>                }<a name="line.709"></a>
<FONT color="green">710</FONT>            }<a name="line.710"></a>
<FONT color="green">711</FONT>    <a name="line.711"></a>
<FONT color="green">712</FONT>            return artifactDownloadInfos;<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>        public ArtifactContent getArtifactContentText( String groupId, String artifactId, String version, String classifier,<a name="line.715"></a>
<FONT color="green">716</FONT>                                                       String type, String path, String repositoryId )<a name="line.716"></a>
<FONT color="green">717</FONT>            throws ArchivaRestServiceException<a name="line.717"></a>
<FONT color="green">718</FONT>        {<a name="line.718"></a>
<FONT color="green">719</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.719"></a>
<FONT color="green">720</FONT>            try<a name="line.720"></a>
<FONT color="green">721</FONT>            {<a name="line.721"></a>
<FONT color="green">722</FONT>                for ( String repoId : selectedRepos )<a name="line.722"></a>
<FONT color="green">723</FONT>                {<a name="line.723"></a>
<FONT color="green">724</FONT>    <a name="line.724"></a>
<FONT color="green">725</FONT>                    ManagedRepositoryContent managedRepositoryContent =<a name="line.725"></a>
<FONT color="green">726</FONT>                        repositoryContentFactory.getManagedRepositoryContent( repoId );<a name="line.726"></a>
<FONT color="green">727</FONT>                    ArchivaArtifact archivaArtifact = new ArchivaArtifact( groupId, artifactId, version, classifier,<a name="line.727"></a>
<FONT color="green">728</FONT>                                                                           StringUtils.isEmpty( type ) ? "jar" : type,<a name="line.728"></a>
<FONT color="green">729</FONT>                                                                           repoId );<a name="line.729"></a>
<FONT color="green">730</FONT>                    File file = managedRepositoryContent.toFile( archivaArtifact );<a name="line.730"></a>
<FONT color="green">731</FONT>                    if ( !file.exists() )<a name="line.731"></a>
<FONT color="green">732</FONT>                    {<a name="line.732"></a>
<FONT color="green">733</FONT>                        log.debug( "file: {} not exists for repository: {} try next repository", file, repoId );<a name="line.733"></a>
<FONT color="green">734</FONT>                        continue;<a name="line.734"></a>
<FONT color="green">735</FONT>                    }<a name="line.735"></a>
<FONT color="green">736</FONT>                    if ( StringUtils.isNotBlank( path ) )<a name="line.736"></a>
<FONT color="green">737</FONT>                    {<a name="line.737"></a>
<FONT color="green">738</FONT>                        // zip entry of the path -&gt; path must a real file entry of the archive<a name="line.738"></a>
<FONT color="green">739</FONT>                        JarFile jarFile = new JarFile( file );<a name="line.739"></a>
<FONT color="green">740</FONT>                        ZipEntry zipEntry = jarFile.getEntry( path );<a name="line.740"></a>
<FONT color="green">741</FONT>                        InputStream inputStream = jarFile.getInputStream( zipEntry );<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>                            return new ArtifactContent( IOUtils.toString( inputStream ), repoId );<a name="line.744"></a>
<FONT color="green">745</FONT>                        }<a name="line.745"></a>
<FONT color="green">746</FONT>                        finally<a name="line.746"></a>
<FONT color="green">747</FONT>                        {<a name="line.747"></a>
<FONT color="green">748</FONT>                            closeQuietly( jarFile );<a name="line.748"></a>
<FONT color="green">749</FONT>                            IOUtils.closeQuietly( inputStream );<a name="line.749"></a>
<FONT color="green">750</FONT>                        }<a name="line.750"></a>
<FONT color="green">751</FONT>                    }<a name="line.751"></a>
<FONT color="green">752</FONT>                    return new ArtifactContent( FileUtils.readFileToString( file ), repoId );<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>            catch ( IOException e )<a name="line.755"></a>
<FONT color="green">756</FONT>            {<a name="line.756"></a>
<FONT color="green">757</FONT>                log.error( e.getMessage(), e );<a name="line.757"></a>
<FONT color="green">758</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.758"></a>
<FONT color="green">759</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.759"></a>
<FONT color="green">760</FONT>            }<a name="line.760"></a>
<FONT color="green">761</FONT>            catch ( RepositoryNotFoundException e )<a name="line.761"></a>
<FONT color="green">762</FONT>            {<a name="line.762"></a>
<FONT color="green">763</FONT>                log.error( e.getMessage(), e );<a name="line.763"></a>
<FONT color="green">764</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.764"></a>
<FONT color="green">765</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.765"></a>
<FONT color="green">766</FONT>            }<a name="line.766"></a>
<FONT color="green">767</FONT>            catch ( RepositoryException e )<a name="line.767"></a>
<FONT color="green">768</FONT>            {<a name="line.768"></a>
<FONT color="green">769</FONT>                log.error( e.getMessage(), e );<a name="line.769"></a>
<FONT color="green">770</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.770"></a>
<FONT color="green">771</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.771"></a>
<FONT color="green">772</FONT>            }<a name="line.772"></a>
<FONT color="green">773</FONT>            log.debug( "artifact: {}:{}:{}:{}:{} not found", groupId, artifactId, version, classifier, type );<a name="line.773"></a>
<FONT color="green">774</FONT>            // 404 ?<a name="line.774"></a>
<FONT color="green">775</FONT>            return new ArtifactContent();<a name="line.775"></a>
<FONT color="green">776</FONT>        }<a name="line.776"></a>
<FONT color="green">777</FONT>    <a name="line.777"></a>
<FONT color="green">778</FONT>        public Boolean artifactAvailable( String groupId, String artifactId, String version, String classifier,<a name="line.778"></a>
<FONT color="green">779</FONT>                                          String repositoryId )<a name="line.779"></a>
<FONT color="green">780</FONT>            throws ArchivaRestServiceException<a name="line.780"></a>
<FONT color="green">781</FONT>        {<a name="line.781"></a>
<FONT color="green">782</FONT>            List&lt;String&gt; selectedRepos = getSelectedRepos( repositoryId );<a name="line.782"></a>
<FONT color="green">783</FONT>    <a name="line.783"></a>
<FONT color="green">784</FONT>            boolean snapshot = VersionUtil.isSnapshot( version );<a name="line.784"></a>
<FONT color="green">785</FONT>    <a name="line.785"></a>
<FONT color="green">786</FONT>            try<a name="line.786"></a>
<FONT color="green">787</FONT>            {<a name="line.787"></a>
<FONT color="green">788</FONT>                for ( String repoId : selectedRepos )<a name="line.788"></a>
<FONT color="green">789</FONT>                {<a name="line.789"></a>
<FONT color="green">790</FONT>    <a name="line.790"></a>
<FONT color="green">791</FONT>                    ManagedRepository managedRepository = managedRepositoryAdmin.getManagedRepository( repoId );<a name="line.791"></a>
<FONT color="green">792</FONT>    <a name="line.792"></a>
<FONT color="green">793</FONT>                    if ( ( snapshot &amp;&amp; !managedRepository.isSnapshots() ) || ( !snapshot<a name="line.793"></a>
<FONT color="green">794</FONT>                        &amp;&amp; managedRepository.isSnapshots() ) )<a name="line.794"></a>
<FONT color="green">795</FONT>                    {<a name="line.795"></a>
<FONT color="green">796</FONT>                        continue;<a name="line.796"></a>
<FONT color="green">797</FONT>                    }<a name="line.797"></a>
<FONT color="green">798</FONT>                    ManagedRepositoryContent managedRepositoryContent =<a name="line.798"></a>
<FONT color="green">799</FONT>                        repositoryContentFactory.getManagedRepositoryContent( repoId );<a name="line.799"></a>
<FONT color="green">800</FONT>                    // FIXME default to jar which can be wrong for war zip etc....<a name="line.800"></a>
<FONT color="green">801</FONT>                    ArchivaArtifact archivaArtifact = new ArchivaArtifact( groupId, artifactId, version,<a name="line.801"></a>
<FONT color="green">802</FONT>                                                                           StringUtils.isEmpty( classifier )<a name="line.802"></a>
<FONT color="green">803</FONT>                                                                               ? ""<a name="line.803"></a>
<FONT color="green">804</FONT>                                                                               : classifier, "jar", repoId );<a name="line.804"></a>
<FONT color="green">805</FONT>                    File file = managedRepositoryContent.toFile( archivaArtifact );<a name="line.805"></a>
<FONT color="green">806</FONT>    <a name="line.806"></a>
<FONT color="green">807</FONT>                    if ( file != null &amp;&amp; file.exists() )<a name="line.807"></a>
<FONT color="green">808</FONT>                    {<a name="line.808"></a>
<FONT color="green">809</FONT>                        return true;<a name="line.809"></a>
<FONT color="green">810</FONT>                    }<a name="line.810"></a>
<FONT color="green">811</FONT>    <a name="line.811"></a>
<FONT color="green">812</FONT>                    // in case of SNAPSHOT we can have timestamped version locally !<a name="line.812"></a>
<FONT color="green">813</FONT>                    if ( StringUtils.endsWith( version, VersionUtil.SNAPSHOT ) )<a name="line.813"></a>
<FONT color="green">814</FONT>                    {<a name="line.814"></a>
<FONT color="green">815</FONT>                        File metadataFile = new File( file.getParent(), MetadataTools.MAVEN_METADATA );<a name="line.815"></a>
<FONT color="green">816</FONT>                        if ( metadataFile.exists() )<a name="line.816"></a>
<FONT color="green">817</FONT>                        {<a name="line.817"></a>
<FONT color="green">818</FONT>                            try<a name="line.818"></a>
<FONT color="green">819</FONT>                            {<a name="line.819"></a>
<FONT color="green">820</FONT>                                ArchivaRepositoryMetadata archivaRepositoryMetadata =<a name="line.820"></a>
<FONT color="green">821</FONT>                                    MavenMetadataReader.read( metadataFile );<a name="line.821"></a>
<FONT color="green">822</FONT>                                int buildNumber = archivaRepositoryMetadata.getSnapshotVersion().getBuildNumber();<a name="line.822"></a>
<FONT color="green">823</FONT>                                String timeStamp = archivaRepositoryMetadata.getSnapshotVersion().getTimestamp();<a name="line.823"></a>
<FONT color="green">824</FONT>                                // rebuild file name with timestamped version and build number<a name="line.824"></a>
<FONT color="green">825</FONT>                                String timeStampFileName = new StringBuilder( artifactId ).append( '-' ).append(<a name="line.825"></a>
<FONT color="green">826</FONT>                                    StringUtils.remove( version, "-" + VersionUtil.SNAPSHOT ) ).append( '-' ).append(<a name="line.826"></a>
<FONT color="green">827</FONT>                                    timeStamp ).append( '-' ).append( Integer.toString( buildNumber ) ).append(<a name="line.827"></a>
<FONT color="green">828</FONT>                                    ( StringUtils.isEmpty( classifier ) ? "" : "-" + classifier ) ).append(<a name="line.828"></a>
<FONT color="green">829</FONT>                                    ".jar" ).toString();<a name="line.829"></a>
<FONT color="green">830</FONT>                                /*File timeStampFile = new File( file.getParent(),<a name="line.830"></a>
<FONT color="green">831</FONT>                                                               artifactId + "-" + StringUtils.remove( version, "-"<a name="line.831"></a>
<FONT color="green">832</FONT>                                                                   + VersionUtil.SNAPSHOT ) + "-" + timeStamp + "-"<a name="line.832"></a>
<FONT color="green">833</FONT>                                                                   + Integer.toString( buildNumber )<a name="line.833"></a>
<FONT color="green">834</FONT>                                                                   + ( StringUtils.isEmpty( classifier )<a name="line.834"></a>
<FONT color="green">835</FONT>                                                                   ? ""<a name="line.835"></a>
<FONT color="green">836</FONT>                                                                   : "-" + classifier ) + ".jar" );*/<a name="line.836"></a>
<FONT color="green">837</FONT>                                File timeStampFile = new File( file.getParent(), timeStampFileName );<a name="line.837"></a>
<FONT color="green">838</FONT>                                log.debug( "try to find timestamped snapshot version file: {}", timeStampFile.getPath() );<a name="line.838"></a>
<FONT color="green">839</FONT>                                if ( timeStampFile.exists() )<a name="line.839"></a>
<FONT color="green">840</FONT>                                {<a name="line.840"></a>
<FONT color="green">841</FONT>                                    return true;<a name="line.841"></a>
<FONT color="green">842</FONT>                                }<a name="line.842"></a>
<FONT color="green">843</FONT>                            }<a name="line.843"></a>
<FONT color="green">844</FONT>                            catch ( XMLException e )<a name="line.844"></a>
<FONT color="green">845</FONT>                            {<a name="line.845"></a>
<FONT color="green">846</FONT>                                log.warn( "skip fail to find timestamped snapshot file: {}", e.getMessage() );<a name="line.846"></a>
<FONT color="green">847</FONT>                            }<a name="line.847"></a>
<FONT color="green">848</FONT>                        }<a name="line.848"></a>
<FONT color="green">849</FONT>                    }<a name="line.849"></a>
<FONT color="green">850</FONT>    <a name="line.850"></a>
<FONT color="green">851</FONT>                    String path = managedRepositoryContent.toPath( archivaArtifact );<a name="line.851"></a>
<FONT color="green">852</FONT>    <a name="line.852"></a>
<FONT color="green">853</FONT>                    file = connectors.fetchFromProxies( managedRepositoryContent, path );<a name="line.853"></a>
<FONT color="green">854</FONT>    <a name="line.854"></a>
<FONT color="green">855</FONT>                    if ( file != null &amp;&amp; file.exists() )<a name="line.855"></a>
<FONT color="green">856</FONT>                    {<a name="line.856"></a>
<FONT color="green">857</FONT>                        // download pom now<a name="line.857"></a>
<FONT color="green">858</FONT>                        String pomPath = StringUtils.substringBeforeLast( path, ".jar" ) + ".pom";<a name="line.858"></a>
<FONT color="green">859</FONT>                        connectors.fetchFromProxies( managedRepositoryContent, pomPath );<a name="line.859"></a>
<FONT color="green">860</FONT>                        return true;<a name="line.860"></a>
<FONT color="green">861</FONT>                    }<a name="line.861"></a>
<FONT color="green">862</FONT>                }<a name="line.862"></a>
<FONT color="green">863</FONT>            }<a name="line.863"></a>
<FONT color="green">864</FONT>            catch ( RepositoryAdminException e )<a name="line.864"></a>
<FONT color="green">865</FONT>            {<a name="line.865"></a>
<FONT color="green">866</FONT>                log.error( e.getMessage(), e );<a name="line.866"></a>
<FONT color="green">867</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.867"></a>
<FONT color="green">868</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<a name="line.868"></a>
<FONT color="green">869</FONT>            }<a name="line.869"></a>
<FONT color="green">870</FONT>            catch ( RepositoryException e )<a name="line.870"></a>
<FONT color="green">871</FONT>            {<a name="line.871"></a>
<FONT color="green">872</FONT>                log.error( e.getMessage(), e );<a name="line.872"></a>
<FONT color="green">873</FONT>                throw new ArchivaRestServiceException( e.getMessage(),<a name="line.873"></a>
<FONT color="green">874</FONT>                                                       Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );<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>            return false;<a name="line.877"></a>
<FONT color="green">878</FONT>        }<a name="line.878"></a>
<FONT color="green">879</FONT>    <a name="line.879"></a>
<FONT color="green">880</FONT>        public Boolean artifactAvailable( String groupId, String artifactId, String version, String repositoryId )<a name="line.880"></a>
<FONT color="green">881</FONT>            throws ArchivaRestServiceException<a name="line.881"></a>
<FONT color="green">882</FONT>        {<a name="line.882"></a>
<FONT color="green">883</FONT>            return artifactAvailable( groupId, artifactId, version, null, repositoryId );<a name="line.883"></a>
<FONT color="green">884</FONT>        }<a name="line.884"></a>
<FONT color="green">885</FONT>    <a name="line.885"></a>
<FONT color="green">886</FONT>        public List&lt;Artifact&gt; getArtifacts( String repositoryId )<a name="line.886"></a>
<FONT color="green">887</FONT>            throws ArchivaRestServiceException<a name="line.887"></a>
<FONT color="green">888</FONT>        {<a name="line.888"></a>
<FONT color="green">889</FONT>            RepositorySession repositorySession = repositorySessionFactory.createSession();<a name="line.889"></a>
<FONT color="green">890</FONT>            try<a name="line.890"></a>
<FONT color="green">891</FONT>            {<a name="line.891"></a>
<FONT color="green">892</FONT>                List&lt;ArtifactMetadata&gt; artifactMetadatas = repositorySession.getRepository().getArtifacts( repositoryId );<a name="line.892"></a>
<FONT color="green">893</FONT>                return buildArtifacts( artifactMetadatas, repositoryId );<a name="line.893"></a>
<FONT color="green">894</FONT>            }<a name="line.894"></a>
<FONT color="green">895</FONT>            catch ( MetadataRepositoryException e )<a name="line.895"></a>
<FONT color="green">896</FONT>            {<a name="line.896"></a>
<FONT color="green">897</FONT>                throw new ArchivaRestServiceException( e.getMessage(), e );<a name="line.897"></a>
<FONT color="green">898</FONT>            }<a name="line.898"></a>
<FONT color="green">899</FONT>            finally<a name="line.899"></a>
<FONT color="green">900</FONT>            {<a name="line.900"></a>
<FONT color="green">901</FONT>                repositorySession.close();<a name="line.901"></a>
<FONT color="green">902</FONT>            }<a name="line.902"></a>
<FONT color="green">903</FONT>        }<a name="line.903"></a>
<FONT color="green">904</FONT>    <a name="line.904"></a>
<FONT color="green">905</FONT>        public Boolean importMetadata( MetadataAddRequest metadataAddRequest, String repositoryId )<a name="line.905"></a>
<FONT color="green">906</FONT>            throws ArchivaRestServiceException<a name="line.906"></a>
<FONT color="green">907</FONT>        {<a name="line.907"></a>
<FONT color="green">908</FONT>            boolean result = true;<a name="line.908"></a>
<FONT color="green">909</FONT>            for ( Map.Entry&lt;String, String&gt; metadata : metadataAddRequest.getMetadatas().entrySet() )<a name="line.909"></a>
<FONT color="green">910</FONT>            {<a name="line.910"></a>
<FONT color="green">911</FONT>                result = addMetadata( metadataAddRequest.getGroupId(), metadataAddRequest.getArtifactId(),<a name="line.911"></a>
<FONT color="green">912</FONT>                                      metadataAddRequest.getVersion(), metadata.getKey(), metadata.getValue(),<a name="line.912"></a>
<FONT color="green">913</FONT>                                      repositoryId );<a name="line.913"></a>
<FONT color="green">914</FONT>                if ( !result )<a name="line.914"></a>
<FONT color="green">915</FONT>                {<a name="line.915"></a>
<FONT color="green">916</FONT>                    break;<a name="line.916"></a>
<FONT color="green">917</FONT>                }<a name="line.917"></a>
<FONT color="green">918</FONT>            }<a name="line.918"></a>
<FONT color="green">919</FONT>            return result;<a name="line.919"></a>
<FONT color="green">920</FONT>        }<a name="line.920"></a>
<FONT color="green">921</FONT>    <a name="line.921"></a>
<FONT color="green">922</FONT>        //---------------------------<a name="line.922"></a>
<FONT color="green">923</FONT>        // internals<a name="line.923"></a>
<FONT color="green">924</FONT>        //---------------------------<a name="line.924"></a>
<FONT color="green">925</FONT>    <a name="line.925"></a>
<FONT color="green">926</FONT>        private void closeQuietly( JarFile jarFile )<a name="line.926"></a>
<FONT color="green">927</FONT>        {<a name="line.927"></a>
<FONT color="green">928</FONT>            if ( jarFile != null )<a name="line.928"></a>
<FONT color="green">929</FONT>            {<a name="line.929"></a>
<FONT color="green">930</FONT>                try<a name="line.930"></a>
<FONT color="green">931</FONT>                {<a name="line.931"></a>
<FONT color="green">932</FONT>                    jarFile.close();<a name="line.932"></a>
<FONT color="green">933</FONT>                }<a name="line.933"></a>
<FONT color="green">934</FONT>                catch ( IOException e )<a name="line.934"></a>
<FONT color="green">935</FONT>                {<a name="line.935"></a>
<FONT color="green">936</FONT>                    log.warn( "ignore error closing jarFile {}", jarFile.getName() );<a name="line.936"></a>
<FONT color="green">937</FONT>                }<a name="line.937"></a>
<FONT color="green">938</FONT>            }<a name="line.938"></a>
<FONT color="green">939</FONT>        }<a name="line.939"></a>
<FONT color="green">940</FONT>    <a name="line.940"></a>
<FONT color="green">941</FONT>        protected List&lt;ArtifactContentEntry&gt; readFileEntries( File file, String filterPath, String repoId )<a name="line.941"></a>
<FONT color="green">942</FONT>            throws IOException<a name="line.942"></a>
<FONT color="green">943</FONT>        {<a name="line.943"></a>
<FONT color="green">944</FONT>            Map&lt;String, ArtifactContentEntry&gt; artifactContentEntryMap = new HashMap&lt;String, ArtifactContentEntry&gt;();<a name="line.944"></a>
<FONT color="green">945</FONT>            int filterDepth = StringUtils.countMatches( filterPath, "/" );<a name="line.945"></a>
<FONT color="green">946</FONT>            /*if ( filterDepth == 0 )<a name="line.946"></a>
<FONT color="green">947</FONT>            {<a name="line.947"></a>
<FONT color="green">948</FONT>                filterDepth = 1;<a name="line.948"></a>
<FONT color="green">949</FONT>            }*/<a name="line.949"></a>
<FONT color="green">950</FONT>            JarFile jarFile = new JarFile( file );<a name="line.950"></a>
<FONT color="green">951</FONT>            try<a name="line.951"></a>
<FONT color="green">952</FONT>            {<a name="line.952"></a>
<FONT color="green">953</FONT>                Enumeration&lt;JarEntry&gt; jarEntryEnumeration = jarFile.entries();<a name="line.953"></a>
<FONT color="green">954</FONT>                while ( jarEntryEnumeration.hasMoreElements() )<a name="line.954"></a>
<FONT color="green">955</FONT>                {<a name="line.955"></a>
<FONT color="green">956</FONT>                    JarEntry currentEntry = jarEntryEnumeration.nextElement();<a name="line.956"></a>
<FONT color="green">957</FONT>                    String cleanedEntryName =<a name="line.957"></a>
<FONT color="green">958</FONT>                        StringUtils.endsWith( currentEntry.getName(), "/" ) ? StringUtils.substringBeforeLast(<a name="line.958"></a>
<FONT color="green">959</FONT>                            currentEntry.getName(), "/" ) : currentEntry.getName();<a name="line.959"></a>
<FONT color="green">960</FONT>                    String entryRootPath = getRootPath( cleanedEntryName );<a name="line.960"></a>
<FONT color="green">961</FONT>                    int depth = StringUtils.countMatches( cleanedEntryName, "/" );<a name="line.961"></a>
<FONT color="green">962</FONT>                    if ( StringUtils.isEmpty( filterPath ) &amp;&amp; !artifactContentEntryMap.containsKey( entryRootPath )<a name="line.962"></a>
<FONT color="green">963</FONT>                        &amp;&amp; depth == filterDepth )<a name="line.963"></a>
<FONT color="green">964</FONT>                    {<a name="line.964"></a>
<FONT color="green">965</FONT>    <a name="line.965"></a>
<FONT color="green">966</FONT>                        artifactContentEntryMap.put( entryRootPath,<a name="line.966"></a>
<FONT color="green">967</FONT>                                                     new ArtifactContentEntry( entryRootPath, !currentEntry.isDirectory(),<a name="line.967"></a>
<FONT color="green">968</FONT>                                                                               depth, repoId ) );<a name="line.968"></a>
<FONT color="green">969</FONT>                    }<a name="line.969"></a>
<FONT color="green">970</FONT>                    else<a name="line.970"></a>
<FONT color="green">971</FONT>                    {<a name="line.971"></a>
<FONT color="green">972</FONT>                        if ( StringUtils.startsWith( cleanedEntryName, filterPath ) &amp;&amp; ( depth == filterDepth || (<a name="line.972"></a>
<FONT color="green">973</FONT>                            !currentEntry.isDirectory() &amp;&amp; depth == filterDepth ) ) )<a name="line.973"></a>
<FONT color="green">974</FONT>                        {<a name="line.974"></a>
<FONT color="green">975</FONT>                            artifactContentEntryMap.put( cleanedEntryName, new ArtifactContentEntry( cleanedEntryName,<a name="line.975"></a>
<FONT color="green">976</FONT>                                                                                                     !currentEntry.isDirectory(),<a name="line.976"></a>
<FONT color="green">977</FONT>                                                                                                     depth, repoId ) );<a name="line.977"></a>
<FONT color="green">978</FONT>                        }<a name="line.978"></a>
<FONT color="green">979</FONT>                    }<a name="line.979"></a>
<FONT color="green">980</FONT>                }<a name="line.980"></a>
<FONT color="green">981</FONT>    <a name="line.981"></a>
<FONT color="green">982</FONT>                if ( StringUtils.isNotEmpty( filterPath ) )<a name="line.982"></a>
<FONT color="green">983</FONT>                {<a name="line.983"></a>
<FONT color="green">984</FONT>                    Map&lt;String, ArtifactContentEntry&gt; filteredArtifactContentEntryMap =<a name="line.984"></a>
<FONT color="green">985</FONT>                        new HashMap&lt;String, ArtifactContentEntry&gt;();<a name="line.985"></a>
<FONT color="green">986</FONT>    <a name="line.986"></a>
<FONT color="green">987</FONT>                    for ( Map.Entry&lt;String, ArtifactContentEntry&gt; entry : artifactContentEntryMap.entrySet() )<a name="line.987"></a>
<FONT color="green">988</FONT>                    {<a name="line.988"></a>
<FONT color="green">989</FONT>                        filteredArtifactContentEntryMap.put( entry.getKey(), entry.getValue() );<a name="line.989"></a>
<FONT color="green">990</FONT>                    }<a name="line.990"></a>
<FONT color="green">991</FONT>    <a name="line.991"></a>
<FONT color="green">992</FONT>                    List&lt;ArtifactContentEntry&gt; sorted = getSmallerDepthEntries( filteredArtifactContentEntryMap );<a name="line.992"></a>
<FONT color="green">993</FONT>                    if ( sorted == null )<a name="line.993"></a>
<FONT color="green">994</FONT>                    {<a name="line.994"></a>
<FONT color="green">995</FONT>                        return Collections.emptyList();<a name="line.995"></a>
<FONT color="green">996</FONT>                    }<a name="line.996"></a>
<FONT color="green">997</FONT>                    Collections.sort( sorted, ArtifactContentEntryComparator.INSTANCE );<a name="line.997"></a>
<FONT color="green">998</FONT>                    return sorted;<a name="line.998"></a>
<FONT color="green">999</FONT>                }<a name="line.999"></a>
<FONT color="green">1000</FONT>            }<a name="line.1000"></a>
<FONT color="green">1001</FONT>            finally<a name="line.1001"></a>
<FONT color="green">1002</FONT>            {<a name="line.1002"></a>
<FONT color="green">1003</FONT>                if ( jarFile != null )<a name="line.1003"></a>
<FONT color="green">1004</FONT>                {<a name="line.1004"></a>
<FONT color="green">1005</FONT>                    jarFile.close();<a name="line.1005"></a>
<FONT color="green">1006</FONT>                }<a name="line.1006"></a>
<FONT color="green">1007</FONT>            }<a name="line.1007"></a>
<FONT color="green">1008</FONT>            List&lt;ArtifactContentEntry&gt; sorted = new ArrayList&lt;ArtifactContentEntry&gt;( artifactContentEntryMap.values() );<a name="line.1008"></a>
<FONT color="green">1009</FONT>            Collections.sort( sorted, ArtifactContentEntryComparator.INSTANCE );<a name="line.1009"></a>
<FONT color="green">1010</FONT>            return sorted;<a name="line.1010"></a>
<FONT color="green">1011</FONT>        }<a name="line.1011"></a>
<FONT color="green">1012</FONT>    <a name="line.1012"></a>
<FONT color="green">1013</FONT>        private List&lt;ArtifactContentEntry&gt; getSmallerDepthEntries( Map&lt;String, ArtifactContentEntry&gt; entries )<a name="line.1013"></a>
<FONT color="green">1014</FONT>        {<a name="line.1014"></a>
<FONT color="green">1015</FONT>            int smallestDepth = Integer.MAX_VALUE;<a name="line.1015"></a>
<FONT color="green">1016</FONT>            Map&lt;Integer, List&lt;ArtifactContentEntry&gt;&gt; perDepthList = new HashMap&lt;Integer, List&lt;ArtifactContentEntry&gt;&gt;();<a name="line.1016"></a>
<FONT color="green">1017</FONT>            for ( Map.Entry&lt;String, ArtifactContentEntry&gt; entry : entries.entrySet() )<a name="line.1017"></a>
<FONT color="green">1018</FONT>            {<a name="line.1018"></a>
<FONT color="green">1019</FONT>    <a name="line.1019"></a>
<FONT color="green">1020</FONT>                ArtifactContentEntry current = entry.getValue();<a name="line.1020"></a>
<FONT color="green">1021</FONT>    <a name="line.1021"></a>
<FONT color="green">1022</FONT>                if ( current.getDepth() &lt; smallestDepth )<a name="line.1022"></a>
<FONT color="green">1023</FONT>                {<a name="line.1023"></a>
<FONT color="green">1024</FONT>                    smallestDepth = current.getDepth();<a name="line.1024"></a>
<FONT color="green">1025</FONT>                }<a name="line.1025"></a>
<FONT color="green">1026</FONT>    <a name="line.1026"></a>
<FONT color="green">1027</FONT>                List&lt;ArtifactContentEntry&gt; currentList = perDepthList.get( current.getDepth() );<a name="line.1027"></a>
<FONT color="green">1028</FONT>    <a name="line.1028"></a>
<FONT color="green">1029</FONT>                if ( currentList == null )<a name="line.1029"></a>
<FONT color="green">1030</FONT>                {<a name="line.1030"></a>
<FONT color="green">1031</FONT>                    currentList = new ArrayList&lt;ArtifactContentEntry&gt;();<a name="line.1031"></a>
<FONT color="green">1032</FONT>                    currentList.add( current );<a name="line.1032"></a>
<FONT color="green">1033</FONT>                    perDepthList.put( current.getDepth(), currentList );<a name="line.1033"></a>
<FONT color="green">1034</FONT>                }<a name="line.1034"></a>
<FONT color="green">1035</FONT>                else<a name="line.1035"></a>
<FONT color="green">1036</FONT>                {<a name="line.1036"></a>
<FONT color="green">1037</FONT>                    currentList.add( current );<a name="line.1037"></a>
<FONT color="green">1038</FONT>                }<a name="line.1038"></a>
<FONT color="green">1039</FONT>    <a name="line.1039"></a>
<FONT color="green">1040</FONT>            }<a name="line.1040"></a>
<FONT color="green">1041</FONT>    <a name="line.1041"></a>
<FONT color="green">1042</FONT>            return perDepthList.get( smallestDepth );<a name="line.1042"></a>
<FONT color="green">1043</FONT>        }<a name="line.1043"></a>
<FONT color="green">1044</FONT>    <a name="line.1044"></a>
<FONT color="green">1045</FONT>        /**<a name="line.1045"></a>
<FONT color="green">1046</FONT>         * @param path<a name="line.1046"></a>
<FONT color="green">1047</FONT>         * @return org/apache -&gt; org , org -&gt; org<a name="line.1047"></a>
<FONT color="green">1048</FONT>         */<a name="line.1048"></a>
<FONT color="green">1049</FONT>        private String getRootPath( String path )<a name="line.1049"></a>
<FONT color="green">1050</FONT>        {<a name="line.1050"></a>
<FONT color="green">1051</FONT>            if ( StringUtils.contains( path, '/' ) )<a name="line.1051"></a>
<FONT color="green">1052</FONT>            {<a name="line.1052"></a>
<FONT color="green">1053</FONT>                return StringUtils.substringBefore( path, "/" );<a name="line.1053"></a>
<FONT color="green">1054</FONT>            }<a name="line.1054"></a>
<FONT color="green">1055</FONT>            return path;<a name="line.1055"></a>
<FONT color="green">1056</FONT>        }<a name="line.1056"></a>
<FONT color="green">1057</FONT>    <a name="line.1057"></a>
<FONT color="green">1058</FONT>        private List&lt;String&gt; getSelectedRepos( String repositoryId )<a name="line.1058"></a>
<FONT color="green">1059</FONT>            throws ArchivaRestServiceException<a name="line.1059"></a>
<FONT color="green">1060</FONT>        {<a name="line.1060"></a>
<FONT color="green">1061</FONT>    <a name="line.1061"></a>
<FONT color="green">1062</FONT>            List&lt;String&gt; selectedRepos = getObservableRepos();<a name="line.1062"></a>
<FONT color="green">1063</FONT>    <a name="line.1063"></a>
<FONT color="green">1064</FONT>            if ( CollectionUtils.isEmpty( selectedRepos ) )<a name="line.1064"></a>
<FONT color="green">1065</FONT>            {<a name="line.1065"></a>
<FONT color="green">1066</FONT>                return Collections.emptyList();<a name="line.1066"></a>
<FONT color="green">1067</FONT>            }<a name="line.1067"></a>
<FONT color="green">1068</FONT>    <a name="line.1068"></a>
<FONT color="green">1069</FONT>            if ( StringUtils.isNotEmpty( repositoryId ) )<a name="line.1069"></a>
<FONT color="green">1070</FONT>            {<a name="line.1070"></a>
<FONT color="green">1071</FONT>                // check user has karma on the repository<a name="line.1071"></a>
<FONT color="green">1072</FONT>                if ( !selectedRepos.contains( repositoryId ) )<a name="line.1072"></a>
<FONT color="green">1073</FONT>                {<a name="line.1073"></a>
<FONT color="green">1074</FONT>                    throw new ArchivaRestServiceException( "browse.root.groups.repositoy.denied",<a name="line.1074"></a>
<FONT color="green">1075</FONT>                                                           Response.Status.FORBIDDEN.getStatusCode(), null );<a name="line.1075"></a>
<FONT color="green">1076</FONT>                }<a name="line.1076"></a>
<FONT color="green">1077</FONT>                selectedRepos = Collections.singletonList( repositoryId );<a name="line.1077"></a>
<FONT color="green">1078</FONT>            }<a name="line.1078"></a>
<FONT color="green">1079</FONT>            return selectedRepos;<a name="line.1079"></a>
<FONT color="green">1080</FONT>        }<a name="line.1080"></a>
<FONT color="green">1081</FONT>    <a name="line.1081"></a>
<FONT color="green">1082</FONT>    <a name="line.1082"></a>
<FONT color="green">1083</FONT>        private String collapseNamespaces( RepositorySession repositorySession, MetadataResolver metadataResolver,<a name="line.1083"></a>
<FONT color="green">1084</FONT>                                           Collection&lt;String&gt; repoIds, String n )<a name="line.1084"></a>
<FONT color="green">1085</FONT>            throws MetadataResolutionException<a name="line.1085"></a>
<FONT color="green">1086</FONT>        {<a name="line.1086"></a>
<FONT color="green">1087</FONT>            Set&lt;String&gt; subNamespaces = new LinkedHashSet&lt;String&gt;();<a name="line.1087"></a>
<FONT color="green">1088</FONT>            for ( String repoId : repoIds )<a name="line.1088"></a>
<FONT color="green">1089</FONT>            {<a name="line.1089"></a>
<FONT color="green">1090</FONT>                subNamespaces.addAll( metadataResolver.resolveNamespaces( repositorySession, repoId, n ) );<a name="line.1090"></a>
<FONT color="green">1091</FONT>            }<a name="line.1091"></a>
<FONT color="green">1092</FONT>            if ( subNamespaces.size() != 1 )<a name="line.1092"></a>
<FONT color="green">1093</FONT>            {<a name="line.1093"></a>
<FONT color="green">1094</FONT>                log.debug( "{} is not collapsible as it has sub-namespaces: {}", n, subNamespaces );<a name="line.1094"></a>
<FONT color="green">1095</FONT>                return n;<a name="line.1095"></a>
<FONT color="green">1096</FONT>            }<a name="line.1096"></a>
<FONT color="green">1097</FONT>            else<a name="line.1097"></a>
<FONT color="green">1098</FONT>            {<a name="line.1098"></a>
<FONT color="green">1099</FONT>                for ( String repoId : repoIds )<a name="line.1099"></a>
<FONT color="green">1100</FONT>                {<a name="line.1100"></a>
<FONT color="green">1101</FONT>                    Collection&lt;String&gt; projects = metadataResolver.resolveProjects( repositorySession, repoId, n );<a name="line.1101"></a>
<FONT color="green">1102</FONT>                    if ( projects != null &amp;&amp; !projects.isEmpty() )<a name="line.1102"></a>
<FONT color="green">1103</FONT>                    {<a name="line.1103"></a>
<FONT color="green">1104</FONT>                        log.debug( "{} is not collapsible as it has projects", n );<a name="line.1104"></a>
<FONT color="green">1105</FONT>                        return n;<a name="line.1105"></a>
<FONT color="green">1106</FONT>                    }<a name="line.1106"></a>
<FONT color="green">1107</FONT>                }<a name="line.1107"></a>
<FONT color="green">1108</FONT>                return collapseNamespaces( repositorySession, metadataResolver, repoIds,<a name="line.1108"></a>
<FONT color="green">1109</FONT>                                           n + "." + subNamespaces.iterator().next() );<a name="line.1109"></a>
<FONT color="green">1110</FONT>            }<a name="line.1110"></a>
<FONT color="green">1111</FONT>        }<a name="line.1111"></a>
<FONT color="green">1112</FONT>    }<a name="line.1112"></a>




























































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