<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    package org.apache.archiva.metadata.repository.file;<a name="line.1"></a>
<FONT color="green">002</FONT>    <a name="line.2"></a>
<FONT color="green">003</FONT>    /*<a name="line.3"></a>
<FONT color="green">004</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.4"></a>
<FONT color="green">005</FONT>     * or more contributor license agreements.  See the NOTICE file<a name="line.5"></a>
<FONT color="green">006</FONT>     * distributed with this work for additional information<a name="line.6"></a>
<FONT color="green">007</FONT>     * regarding copyright ownership.  The ASF licenses this file<a name="line.7"></a>
<FONT color="green">008</FONT>     * to you under the Apache License, Version 2.0 (the<a name="line.8"></a>
<FONT color="green">009</FONT>     * "License"); you may not use this file except in compliance<a name="line.9"></a>
<FONT color="green">010</FONT>     * with the License.  You may obtain a copy of the License at<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     *   http://www.apache.org/licenses/LICENSE-2.0<a name="line.12"></a>
<FONT color="green">013</FONT>     *<a name="line.13"></a>
<FONT color="green">014</FONT>     * Unless required by applicable law or agreed to in writing,<a name="line.14"></a>
<FONT color="green">015</FONT>     * software distributed under the License is distributed on an<a name="line.15"></a>
<FONT color="green">016</FONT>     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.16"></a>
<FONT color="green">017</FONT>     * KIND, either express or implied.  See the License for the<a name="line.17"></a>
<FONT color="green">018</FONT>     * specific language governing permissions and limitations<a name="line.18"></a>
<FONT color="green">019</FONT>     * under the License.<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    <a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.archiva.configuration.ArchivaConfiguration;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.archiva.configuration.ManagedRepositoryConfiguration;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.archiva.metadata.model.ArtifactMetadata;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.archiva.metadata.model.CiManagement;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.archiva.metadata.model.Dependency;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.archiva.metadata.model.IssueManagement;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.archiva.metadata.model.License;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.archiva.metadata.model.MailingList;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.archiva.metadata.model.MetadataFacet;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.archiva.metadata.model.MetadataFacetFactory;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.archiva.metadata.model.Organization;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.archiva.metadata.model.ProjectMetadata;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.apache.archiva.metadata.model.ProjectVersionMetadata;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.apache.archiva.metadata.model.ProjectVersionReference;<a name="line.35"></a>
<FONT color="green">036</FONT>    import org.apache.archiva.metadata.model.Scm;<a name="line.36"></a>
<FONT color="green">037</FONT>    import org.apache.archiva.metadata.repository.MetadataRepository;<a name="line.37"></a>
<FONT color="green">038</FONT>    import org.apache.archiva.metadata.repository.MetadataRepositoryException;<a name="line.38"></a>
<FONT color="green">039</FONT>    import org.apache.commons.io.FileUtils;<a name="line.39"></a>
<FONT color="green">040</FONT>    import org.apache.commons.io.IOUtils;<a name="line.40"></a>
<FONT color="green">041</FONT>    import org.slf4j.Logger;<a name="line.41"></a>
<FONT color="green">042</FONT>    import org.slf4j.LoggerFactory;<a name="line.42"></a>
<FONT color="green">043</FONT>    <a name="line.43"></a>
<FONT color="green">044</FONT>    import java.io.File;<a name="line.44"></a>
<FONT color="green">045</FONT>    import java.io.FileInputStream;<a name="line.45"></a>
<FONT color="green">046</FONT>    import java.io.FileNotFoundException;<a name="line.46"></a>
<FONT color="green">047</FONT>    import java.io.FileOutputStream;<a name="line.47"></a>
<FONT color="green">048</FONT>    import java.io.IOException;<a name="line.48"></a>
<FONT color="green">049</FONT>    import java.util.ArrayList;<a name="line.49"></a>
<FONT color="green">050</FONT>    import java.util.Arrays;<a name="line.50"></a>
<FONT color="green">051</FONT>    import java.util.Collection;<a name="line.51"></a>
<FONT color="green">052</FONT>    import java.util.Collections;<a name="line.52"></a>
<FONT color="green">053</FONT>    import java.util.Comparator;<a name="line.53"></a>
<FONT color="green">054</FONT>    import java.util.Date;<a name="line.54"></a>
<FONT color="green">055</FONT>    import java.util.HashMap;<a name="line.55"></a>
<FONT color="green">056</FONT>    import java.util.HashSet;<a name="line.56"></a>
<FONT color="green">057</FONT>    import java.util.LinkedHashSet;<a name="line.57"></a>
<FONT color="green">058</FONT>    import java.util.List;<a name="line.58"></a>
<FONT color="green">059</FONT>    import java.util.Map;<a name="line.59"></a>
<FONT color="green">060</FONT>    import java.util.Properties;<a name="line.60"></a>
<FONT color="green">061</FONT>    import java.util.Set;<a name="line.61"></a>
<FONT color="green">062</FONT>    import java.util.StringTokenizer;<a name="line.62"></a>
<FONT color="green">063</FONT>    <a name="line.63"></a>
<FONT color="green">064</FONT>    public class FileMetadataRepository<a name="line.64"></a>
<FONT color="green">065</FONT>        implements MetadataRepository<a name="line.65"></a>
<FONT color="green">066</FONT>    {<a name="line.66"></a>
<FONT color="green">067</FONT>        private final Map&lt;String, MetadataFacetFactory&gt; metadataFacetFactories;<a name="line.67"></a>
<FONT color="green">068</FONT>    <a name="line.68"></a>
<FONT color="green">069</FONT>        private final ArchivaConfiguration configuration;<a name="line.69"></a>
<FONT color="green">070</FONT>    <a name="line.70"></a>
<FONT color="green">071</FONT>        private Logger log = LoggerFactory.getLogger( FileMetadataRepository.class );<a name="line.71"></a>
<FONT color="green">072</FONT>    <a name="line.72"></a>
<FONT color="green">073</FONT>        private static final String PROJECT_METADATA_KEY = "project-metadata";<a name="line.73"></a>
<FONT color="green">074</FONT>    <a name="line.74"></a>
<FONT color="green">075</FONT>        private static final String PROJECT_VERSION_METADATA_KEY = "version-metadata";<a name="line.75"></a>
<FONT color="green">076</FONT>    <a name="line.76"></a>
<FONT color="green">077</FONT>        private static final String NAMESPACE_METADATA_KEY = "namespace-metadata";<a name="line.77"></a>
<FONT color="green">078</FONT>    <a name="line.78"></a>
<FONT color="green">079</FONT>        private static final String METADATA_KEY = "metadata";<a name="line.79"></a>
<FONT color="green">080</FONT>    <a name="line.80"></a>
<FONT color="green">081</FONT>        public FileMetadataRepository( Map&lt;String, MetadataFacetFactory&gt; metadataFacetFactories,<a name="line.81"></a>
<FONT color="green">082</FONT>                                       ArchivaConfiguration configuration )<a name="line.82"></a>
<FONT color="green">083</FONT>        {<a name="line.83"></a>
<FONT color="green">084</FONT>            this.metadataFacetFactories = metadataFacetFactories;<a name="line.84"></a>
<FONT color="green">085</FONT>            this.configuration = configuration;<a name="line.85"></a>
<FONT color="green">086</FONT>        }<a name="line.86"></a>
<FONT color="green">087</FONT>    <a name="line.87"></a>
<FONT color="green">088</FONT>        private File getBaseDirectory( String repoId )<a name="line.88"></a>
<FONT color="green">089</FONT>        {<a name="line.89"></a>
<FONT color="green">090</FONT>            // TODO: should be configurable, like the index<a name="line.90"></a>
<FONT color="green">091</FONT>            String basedir = configuration.getConfiguration().getManagedRepositoriesAsMap().get( repoId ).getLocation();<a name="line.91"></a>
<FONT color="green">092</FONT>            return new File( basedir, ".archiva" );<a name="line.92"></a>
<FONT color="green">093</FONT>        }<a name="line.93"></a>
<FONT color="green">094</FONT>    <a name="line.94"></a>
<FONT color="green">095</FONT>        private File getDirectory( String repoId )<a name="line.95"></a>
<FONT color="green">096</FONT>        {<a name="line.96"></a>
<FONT color="green">097</FONT>            return new File( getBaseDirectory( repoId ), "content" );<a name="line.97"></a>
<FONT color="green">098</FONT>        }<a name="line.98"></a>
<FONT color="green">099</FONT>    <a name="line.99"></a>
<FONT color="green">100</FONT>        public void updateProject( String repoId, ProjectMetadata project )<a name="line.100"></a>
<FONT color="green">101</FONT>        {<a name="line.101"></a>
<FONT color="green">102</FONT>            updateProject( repoId, project.getNamespace(), project.getId() );<a name="line.102"></a>
<FONT color="green">103</FONT>        }<a name="line.103"></a>
<FONT color="green">104</FONT>    <a name="line.104"></a>
<FONT color="green">105</FONT>        private void updateProject( String repoId, String namespace, String id )<a name="line.105"></a>
<FONT color="green">106</FONT>        {<a name="line.106"></a>
<FONT color="green">107</FONT>            // TODO: this is a more braindead implementation than we would normally expect, for prototyping purposes<a name="line.107"></a>
<FONT color="green">108</FONT>            updateNamespace( repoId, namespace );<a name="line.108"></a>
<FONT color="green">109</FONT>    <a name="line.109"></a>
<FONT color="green">110</FONT>            try<a name="line.110"></a>
<FONT color="green">111</FONT>            {<a name="line.111"></a>
<FONT color="green">112</FONT>                File namespaceDirectory = new File( getDirectory( repoId ), namespace );<a name="line.112"></a>
<FONT color="green">113</FONT>                Properties properties = new Properties();<a name="line.113"></a>
<FONT color="green">114</FONT>                properties.setProperty( "namespace", namespace );<a name="line.114"></a>
<FONT color="green">115</FONT>                properties.setProperty( "id", id );<a name="line.115"></a>
<FONT color="green">116</FONT>                writeProperties( properties, new File( namespaceDirectory, id ), PROJECT_METADATA_KEY );<a name="line.116"></a>
<FONT color="green">117</FONT>            }<a name="line.117"></a>
<FONT color="green">118</FONT>            catch ( IOException e )<a name="line.118"></a>
<FONT color="green">119</FONT>            {<a name="line.119"></a>
<FONT color="green">120</FONT>                // TODO!<a name="line.120"></a>
<FONT color="green">121</FONT>                log.error( e.getMessage(), e );<a name="line.121"></a>
<FONT color="green">122</FONT>            }<a name="line.122"></a>
<FONT color="green">123</FONT>        }<a name="line.123"></a>
<FONT color="green">124</FONT>    <a name="line.124"></a>
<FONT color="green">125</FONT>        public void updateProjectVersion( String repoId, String namespace, String projectId,<a name="line.125"></a>
<FONT color="green">126</FONT>                                          ProjectVersionMetadata versionMetadata )<a name="line.126"></a>
<FONT color="green">127</FONT>        {<a name="line.127"></a>
<FONT color="green">128</FONT>            updateProject( repoId, namespace, projectId );<a name="line.128"></a>
<FONT color="green">129</FONT>    <a name="line.129"></a>
<FONT color="green">130</FONT>            File directory =<a name="line.130"></a>
<FONT color="green">131</FONT>                new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + versionMetadata.getId() );<a name="line.131"></a>
<FONT color="green">132</FONT>    <a name="line.132"></a>
<FONT color="green">133</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.133"></a>
<FONT color="green">134</FONT>            // remove properties that are not references or artifacts<a name="line.134"></a>
<FONT color="green">135</FONT>            for ( Object key : new ArrayList&lt;Object&gt;( properties.keySet() ) )<a name="line.135"></a>
<FONT color="green">136</FONT>            {<a name="line.136"></a>
<FONT color="green">137</FONT>                String name = (String) key;<a name="line.137"></a>
<FONT color="green">138</FONT>                if ( !name.contains( ":" ) &amp;&amp; !name.equals( "facetIds" ) )<a name="line.138"></a>
<FONT color="green">139</FONT>                {<a name="line.139"></a>
<FONT color="green">140</FONT>                    properties.remove( name );<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>                // clear the facet contents so old properties are no longer written<a name="line.143"></a>
<FONT color="green">144</FONT>                clearMetadataFacetProperties( versionMetadata.getFacetList(), properties, "" );<a name="line.144"></a>
<FONT color="green">145</FONT>            }<a name="line.145"></a>
<FONT color="green">146</FONT>            properties.setProperty( "id", versionMetadata.getId() );<a name="line.146"></a>
<FONT color="green">147</FONT>            setProperty( properties, "name", versionMetadata.getName() );<a name="line.147"></a>
<FONT color="green">148</FONT>            setProperty( properties, "description", versionMetadata.getDescription() );<a name="line.148"></a>
<FONT color="green">149</FONT>            setProperty( properties, "url", versionMetadata.getUrl() );<a name="line.149"></a>
<FONT color="green">150</FONT>            setProperty( properties, "incomplete", String.valueOf( versionMetadata.isIncomplete() ) );<a name="line.150"></a>
<FONT color="green">151</FONT>            if ( versionMetadata.getScm() != null )<a name="line.151"></a>
<FONT color="green">152</FONT>            {<a name="line.152"></a>
<FONT color="green">153</FONT>                setProperty( properties, "scm.connection", versionMetadata.getScm().getConnection() );<a name="line.153"></a>
<FONT color="green">154</FONT>                setProperty( properties, "scm.developerConnection", versionMetadata.getScm().getDeveloperConnection() );<a name="line.154"></a>
<FONT color="green">155</FONT>                setProperty( properties, "scm.url", versionMetadata.getScm().getUrl() );<a name="line.155"></a>
<FONT color="green">156</FONT>            }<a name="line.156"></a>
<FONT color="green">157</FONT>            if ( versionMetadata.getCiManagement() != null )<a name="line.157"></a>
<FONT color="green">158</FONT>            {<a name="line.158"></a>
<FONT color="green">159</FONT>                setProperty( properties, "ci.system", versionMetadata.getCiManagement().getSystem() );<a name="line.159"></a>
<FONT color="green">160</FONT>                setProperty( properties, "ci.url", versionMetadata.getCiManagement().getUrl() );<a name="line.160"></a>
<FONT color="green">161</FONT>            }<a name="line.161"></a>
<FONT color="green">162</FONT>            if ( versionMetadata.getIssueManagement() != null )<a name="line.162"></a>
<FONT color="green">163</FONT>            {<a name="line.163"></a>
<FONT color="green">164</FONT>                setProperty( properties, "issue.system", versionMetadata.getIssueManagement().getSystem() );<a name="line.164"></a>
<FONT color="green">165</FONT>                setProperty( properties, "issue.url", versionMetadata.getIssueManagement().getUrl() );<a name="line.165"></a>
<FONT color="green">166</FONT>            }<a name="line.166"></a>
<FONT color="green">167</FONT>            if ( versionMetadata.getOrganization() != null )<a name="line.167"></a>
<FONT color="green">168</FONT>            {<a name="line.168"></a>
<FONT color="green">169</FONT>                setProperty( properties, "org.name", versionMetadata.getOrganization().getName() );<a name="line.169"></a>
<FONT color="green">170</FONT>                setProperty( properties, "org.url", versionMetadata.getOrganization().getUrl() );<a name="line.170"></a>
<FONT color="green">171</FONT>            }<a name="line.171"></a>
<FONT color="green">172</FONT>            int i = 0;<a name="line.172"></a>
<FONT color="green">173</FONT>            for ( License license : versionMetadata.getLicenses() )<a name="line.173"></a>
<FONT color="green">174</FONT>            {<a name="line.174"></a>
<FONT color="green">175</FONT>                setProperty( properties, "license." + i + ".name", license.getName() );<a name="line.175"></a>
<FONT color="green">176</FONT>                setProperty( properties, "license." + i + ".url", license.getUrl() );<a name="line.176"></a>
<FONT color="green">177</FONT>                i++;<a name="line.177"></a>
<FONT color="green">178</FONT>            }<a name="line.178"></a>
<FONT color="green">179</FONT>            i = 0;<a name="line.179"></a>
<FONT color="green">180</FONT>            for ( MailingList mailingList : versionMetadata.getMailingLists() )<a name="line.180"></a>
<FONT color="green">181</FONT>            {<a name="line.181"></a>
<FONT color="green">182</FONT>                setProperty( properties, "mailingList." + i + ".archive", mailingList.getMainArchiveUrl() );<a name="line.182"></a>
<FONT color="green">183</FONT>                setProperty( properties, "mailingList." + i + ".name", mailingList.getName() );<a name="line.183"></a>
<FONT color="green">184</FONT>                setProperty( properties, "mailingList." + i + ".post", mailingList.getPostAddress() );<a name="line.184"></a>
<FONT color="green">185</FONT>                setProperty( properties, "mailingList." + i + ".unsubscribe", mailingList.getUnsubscribeAddress() );<a name="line.185"></a>
<FONT color="green">186</FONT>                setProperty( properties, "mailingList." + i + ".subscribe", mailingList.getSubscribeAddress() );<a name="line.186"></a>
<FONT color="green">187</FONT>                setProperty( properties, "mailingList." + i + ".otherArchives", join( mailingList.getOtherArchives() ) );<a name="line.187"></a>
<FONT color="green">188</FONT>                i++;<a name="line.188"></a>
<FONT color="green">189</FONT>            }<a name="line.189"></a>
<FONT color="green">190</FONT>            i = 0;<a name="line.190"></a>
<FONT color="green">191</FONT>            ProjectVersionReference reference = new ProjectVersionReference();<a name="line.191"></a>
<FONT color="green">192</FONT>            reference.setNamespace( namespace );<a name="line.192"></a>
<FONT color="green">193</FONT>            reference.setProjectId( projectId );<a name="line.193"></a>
<FONT color="green">194</FONT>            reference.setProjectVersion( versionMetadata.getId() );<a name="line.194"></a>
<FONT color="green">195</FONT>            reference.setReferenceType( ProjectVersionReference.ReferenceType.DEPENDENCY );<a name="line.195"></a>
<FONT color="green">196</FONT>            for ( Dependency dependency : versionMetadata.getDependencies() )<a name="line.196"></a>
<FONT color="green">197</FONT>            {<a name="line.197"></a>
<FONT color="green">198</FONT>                setProperty( properties, "dependency." + i + ".classifier", dependency.getClassifier() );<a name="line.198"></a>
<FONT color="green">199</FONT>                setProperty( properties, "dependency." + i + ".scope", dependency.getScope() );<a name="line.199"></a>
<FONT color="green">200</FONT>                setProperty( properties, "dependency." + i + ".systemPath", dependency.getSystemPath() );<a name="line.200"></a>
<FONT color="green">201</FONT>                setProperty( properties, "dependency." + i + ".artifactId", dependency.getArtifactId() );<a name="line.201"></a>
<FONT color="green">202</FONT>                setProperty( properties, "dependency." + i + ".groupId", dependency.getGroupId() );<a name="line.202"></a>
<FONT color="green">203</FONT>                setProperty( properties, "dependency." + i + ".version", dependency.getVersion() );<a name="line.203"></a>
<FONT color="green">204</FONT>                setProperty( properties, "dependency." + i + ".type", dependency.getType() );<a name="line.204"></a>
<FONT color="green">205</FONT>                setProperty( properties, "dependency." + i + ".optional", String.valueOf( dependency.isOptional() ) );<a name="line.205"></a>
<FONT color="green">206</FONT>    <a name="line.206"></a>
<FONT color="green">207</FONT>                updateProjectReference( repoId, dependency.getGroupId(), dependency.getArtifactId(),<a name="line.207"></a>
<FONT color="green">208</FONT>                                        dependency.getVersion(), reference );<a name="line.208"></a>
<FONT color="green">209</FONT>    <a name="line.209"></a>
<FONT color="green">210</FONT>                i++;<a name="line.210"></a>
<FONT color="green">211</FONT>            }<a name="line.211"></a>
<FONT color="green">212</FONT>            Set&lt;String&gt; facetIds = new LinkedHashSet&lt;String&gt;( versionMetadata.getFacetIds() );<a name="line.212"></a>
<FONT color="green">213</FONT>            facetIds.addAll( Arrays.asList( properties.getProperty( "facetIds", "" ).split( "," ) ) );<a name="line.213"></a>
<FONT color="green">214</FONT>            properties.setProperty( "facetIds", join( facetIds ) );<a name="line.214"></a>
<FONT color="green">215</FONT>    <a name="line.215"></a>
<FONT color="green">216</FONT>            updateProjectVersionFacets( versionMetadata, properties );<a name="line.216"></a>
<FONT color="green">217</FONT>    <a name="line.217"></a>
<FONT color="green">218</FONT>            try<a name="line.218"></a>
<FONT color="green">219</FONT>            {<a name="line.219"></a>
<FONT color="green">220</FONT>                writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );<a name="line.220"></a>
<FONT color="green">221</FONT>            }<a name="line.221"></a>
<FONT color="green">222</FONT>            catch ( IOException e )<a name="line.222"></a>
<FONT color="green">223</FONT>            {<a name="line.223"></a>
<FONT color="green">224</FONT>                // TODO<a name="line.224"></a>
<FONT color="green">225</FONT>                log.error( e.getMessage(), e );<a name="line.225"></a>
<FONT color="green">226</FONT>            }<a name="line.226"></a>
<FONT color="green">227</FONT>        }<a name="line.227"></a>
<FONT color="green">228</FONT>    <a name="line.228"></a>
<FONT color="green">229</FONT>        private void updateProjectVersionFacets( ProjectVersionMetadata versionMetadata, Properties properties )<a name="line.229"></a>
<FONT color="green">230</FONT>        {<a name="line.230"></a>
<FONT color="green">231</FONT>            for ( MetadataFacet facet : versionMetadata.getFacetList() )<a name="line.231"></a>
<FONT color="green">232</FONT>            {<a name="line.232"></a>
<FONT color="green">233</FONT>                for ( Map.Entry&lt;String, String&gt; entry : facet.toProperties().entrySet() )<a name="line.233"></a>
<FONT color="green">234</FONT>                {<a name="line.234"></a>
<FONT color="green">235</FONT>                    properties.setProperty( facet.getFacetId() + ":" + entry.getKey(), entry.getValue() );<a name="line.235"></a>
<FONT color="green">236</FONT>                }<a name="line.236"></a>
<FONT color="green">237</FONT>            }<a name="line.237"></a>
<FONT color="green">238</FONT>        }<a name="line.238"></a>
<FONT color="green">239</FONT>    <a name="line.239"></a>
<FONT color="green">240</FONT>        private static void clearMetadataFacetProperties( Collection&lt;MetadataFacet&gt; facetList, Properties properties,<a name="line.240"></a>
<FONT color="green">241</FONT>                                                          String prefix )<a name="line.241"></a>
<FONT color="green">242</FONT>        {<a name="line.242"></a>
<FONT color="green">243</FONT>            List&lt;Object&gt; propsToRemove = new ArrayList&lt;Object&gt;();<a name="line.243"></a>
<FONT color="green">244</FONT>            for ( MetadataFacet facet : facetList )<a name="line.244"></a>
<FONT color="green">245</FONT>            {<a name="line.245"></a>
<FONT color="green">246</FONT>                for ( Object key : properties.keySet() )<a name="line.246"></a>
<FONT color="green">247</FONT>                {<a name="line.247"></a>
<FONT color="green">248</FONT>                    String keyString = (String) key;<a name="line.248"></a>
<FONT color="green">249</FONT>                    if ( keyString.startsWith( prefix + facet.getFacetId() + ":" ) )<a name="line.249"></a>
<FONT color="green">250</FONT>                    {<a name="line.250"></a>
<FONT color="green">251</FONT>                        propsToRemove.add( key );<a name="line.251"></a>
<FONT color="green">252</FONT>                    }<a name="line.252"></a>
<FONT color="green">253</FONT>                }<a name="line.253"></a>
<FONT color="green">254</FONT>            }<a name="line.254"></a>
<FONT color="green">255</FONT>    <a name="line.255"></a>
<FONT color="green">256</FONT>            for ( Object key : propsToRemove )<a name="line.256"></a>
<FONT color="green">257</FONT>            {<a name="line.257"></a>
<FONT color="green">258</FONT>                properties.remove( key );<a name="line.258"></a>
<FONT color="green">259</FONT>            }<a name="line.259"></a>
<FONT color="green">260</FONT>        }<a name="line.260"></a>
<FONT color="green">261</FONT>    <a name="line.261"></a>
<FONT color="green">262</FONT>        private void updateProjectReference( String repoId, String namespace, String projectId, String projectVersion,<a name="line.262"></a>
<FONT color="green">263</FONT>                                             ProjectVersionReference reference )<a name="line.263"></a>
<FONT color="green">264</FONT>        {<a name="line.264"></a>
<FONT color="green">265</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );<a name="line.265"></a>
<FONT color="green">266</FONT>    <a name="line.266"></a>
<FONT color="green">267</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.267"></a>
<FONT color="green">268</FONT>            int i = Integer.parseInt( properties.getProperty( "ref:lastReferenceNum", "-1" ) ) + 1;<a name="line.268"></a>
<FONT color="green">269</FONT>            setProperty( properties, "ref:lastReferenceNum", Integer.toString( i ) );<a name="line.269"></a>
<FONT color="green">270</FONT>            setProperty( properties, "ref:reference." + i + ".namespace", reference.getNamespace() );<a name="line.270"></a>
<FONT color="green">271</FONT>            setProperty( properties, "ref:reference." + i + ".projectId", reference.getProjectId() );<a name="line.271"></a>
<FONT color="green">272</FONT>            setProperty( properties, "ref:reference." + i + ".projectVersion", reference.getProjectVersion() );<a name="line.272"></a>
<FONT color="green">273</FONT>            setProperty( properties, "ref:reference." + i + ".referenceType", reference.getReferenceType().toString() );<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>                writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );<a name="line.277"></a>
<FONT color="green">278</FONT>            }<a name="line.278"></a>
<FONT color="green">279</FONT>            catch ( IOException e )<a name="line.279"></a>
<FONT color="green">280</FONT>            {<a name="line.280"></a>
<FONT color="green">281</FONT>                // TODO<a name="line.281"></a>
<FONT color="green">282</FONT>                log.error( e.getMessage(), e );<a name="line.282"></a>
<FONT color="green">283</FONT>            }<a name="line.283"></a>
<FONT color="green">284</FONT>        }<a name="line.284"></a>
<FONT color="green">285</FONT>    <a name="line.285"></a>
<FONT color="green">286</FONT>        public void updateNamespace( String repoId, String namespace )<a name="line.286"></a>
<FONT color="green">287</FONT>        {<a name="line.287"></a>
<FONT color="green">288</FONT>            try<a name="line.288"></a>
<FONT color="green">289</FONT>            {<a name="line.289"></a>
<FONT color="green">290</FONT>                File namespaceDirectory = new File( getDirectory( repoId ), namespace );<a name="line.290"></a>
<FONT color="green">291</FONT>                Properties properties = new Properties();<a name="line.291"></a>
<FONT color="green">292</FONT>                properties.setProperty( "namespace", namespace );<a name="line.292"></a>
<FONT color="green">293</FONT>                writeProperties( properties, namespaceDirectory, NAMESPACE_METADATA_KEY );<a name="line.293"></a>
<FONT color="green">294</FONT>    <a name="line.294"></a>
<FONT color="green">295</FONT>            }<a name="line.295"></a>
<FONT color="green">296</FONT>            catch ( IOException e )<a name="line.296"></a>
<FONT color="green">297</FONT>            {<a name="line.297"></a>
<FONT color="green">298</FONT>                // TODO!<a name="line.298"></a>
<FONT color="green">299</FONT>                log.error( e.getMessage(), e );<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>    <a name="line.302"></a>
<FONT color="green">303</FONT>        public List&lt;String&gt; getMetadataFacets( String repoId, String facetId )<a name="line.303"></a>
<FONT color="green">304</FONT>        {<a name="line.304"></a>
<FONT color="green">305</FONT>            File directory = getMetadataDirectory( repoId, facetId );<a name="line.305"></a>
<FONT color="green">306</FONT>            List&lt;String&gt; facets = new ArrayList&lt;String&gt;();<a name="line.306"></a>
<FONT color="green">307</FONT>            recurse( facets, "", directory );<a name="line.307"></a>
<FONT color="green">308</FONT>            return facets;<a name="line.308"></a>
<FONT color="green">309</FONT>        }<a name="line.309"></a>
<FONT color="green">310</FONT>    <a name="line.310"></a>
<FONT color="green">311</FONT>        public boolean hasMetadataFacet( String repositoryId, String facetId )<a name="line.311"></a>
<FONT color="green">312</FONT>            throws MetadataRepositoryException<a name="line.312"></a>
<FONT color="green">313</FONT>        {<a name="line.313"></a>
<FONT color="green">314</FONT>            // TODO could be improved a bit<a name="line.314"></a>
<FONT color="green">315</FONT>            return !getMetadataFacets( repositoryId, facetId ).isEmpty();<a name="line.315"></a>
<FONT color="green">316</FONT>        }<a name="line.316"></a>
<FONT color="green">317</FONT>    <a name="line.317"></a>
<FONT color="green">318</FONT>        private void recurse( List&lt;String&gt; facets, String prefix, File directory )<a name="line.318"></a>
<FONT color="green">319</FONT>        {<a name="line.319"></a>
<FONT color="green">320</FONT>            File[] list = directory.listFiles();<a name="line.320"></a>
<FONT color="green">321</FONT>            if ( list != null )<a name="line.321"></a>
<FONT color="green">322</FONT>            {<a name="line.322"></a>
<FONT color="green">323</FONT>                for ( File dir : list )<a name="line.323"></a>
<FONT color="green">324</FONT>                {<a name="line.324"></a>
<FONT color="green">325</FONT>                    if ( dir.isDirectory() )<a name="line.325"></a>
<FONT color="green">326</FONT>                    {<a name="line.326"></a>
<FONT color="green">327</FONT>                        recurse( facets, prefix + "/" + dir.getName(), dir );<a name="line.327"></a>
<FONT color="green">328</FONT>                    }<a name="line.328"></a>
<FONT color="green">329</FONT>                    else if ( dir.getName().equals( METADATA_KEY + ".properties" ) )<a name="line.329"></a>
<FONT color="green">330</FONT>                    {<a name="line.330"></a>
<FONT color="green">331</FONT>                        facets.add( prefix.substring( 1 ) );<a name="line.331"></a>
<FONT color="green">332</FONT>                    }<a name="line.332"></a>
<FONT color="green">333</FONT>                }<a name="line.333"></a>
<FONT color="green">334</FONT>            }<a name="line.334"></a>
<FONT color="green">335</FONT>        }<a name="line.335"></a>
<FONT color="green">336</FONT>    <a name="line.336"></a>
<FONT color="green">337</FONT>        public MetadataFacet getMetadataFacet( String repositoryId, String facetId, String name )<a name="line.337"></a>
<FONT color="green">338</FONT>        {<a name="line.338"></a>
<FONT color="green">339</FONT>            Properties properties;<a name="line.339"></a>
<FONT color="green">340</FONT>            try<a name="line.340"></a>
<FONT color="green">341</FONT>            {<a name="line.341"></a>
<FONT color="green">342</FONT>                properties =<a name="line.342"></a>
<FONT color="green">343</FONT>                    readProperties( new File( getMetadataDirectory( repositoryId, facetId ), name ), METADATA_KEY );<a name="line.343"></a>
<FONT color="green">344</FONT>            }<a name="line.344"></a>
<FONT color="green">345</FONT>            catch ( FileNotFoundException e )<a name="line.345"></a>
<FONT color="green">346</FONT>            {<a name="line.346"></a>
<FONT color="green">347</FONT>                return null;<a name="line.347"></a>
<FONT color="green">348</FONT>            }<a name="line.348"></a>
<FONT color="green">349</FONT>            catch ( IOException e )<a name="line.349"></a>
<FONT color="green">350</FONT>            {<a name="line.350"></a>
<FONT color="green">351</FONT>                // TODO<a name="line.351"></a>
<FONT color="green">352</FONT>                log.error( e.getMessage(), e );<a name="line.352"></a>
<FONT color="green">353</FONT>                return null;<a name="line.353"></a>
<FONT color="green">354</FONT>            }<a name="line.354"></a>
<FONT color="green">355</FONT>            MetadataFacet metadataFacet = null;<a name="line.355"></a>
<FONT color="green">356</FONT>            MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( facetId );<a name="line.356"></a>
<FONT color="green">357</FONT>            if ( metadataFacetFactory != null )<a name="line.357"></a>
<FONT color="green">358</FONT>            {<a name="line.358"></a>
<FONT color="green">359</FONT>                metadataFacet = metadataFacetFactory.createMetadataFacet( repositoryId, name );<a name="line.359"></a>
<FONT color="green">360</FONT>                Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();<a name="line.360"></a>
<FONT color="green">361</FONT>                for ( Object key : new ArrayList( properties.keySet() ) )<a name="line.361"></a>
<FONT color="green">362</FONT>                {<a name="line.362"></a>
<FONT color="green">363</FONT>                    String property = (String) key;<a name="line.363"></a>
<FONT color="green">364</FONT>                    map.put( property, properties.getProperty( property ) );<a name="line.364"></a>
<FONT color="green">365</FONT>                }<a name="line.365"></a>
<FONT color="green">366</FONT>                metadataFacet.fromProperties( map );<a name="line.366"></a>
<FONT color="green">367</FONT>            }<a name="line.367"></a>
<FONT color="green">368</FONT>            return metadataFacet;<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>        public void addMetadataFacet( String repositoryId, MetadataFacet metadataFacet )<a name="line.371"></a>
<FONT color="green">372</FONT>        {<a name="line.372"></a>
<FONT color="green">373</FONT>            Properties properties = new Properties();<a name="line.373"></a>
<FONT color="green">374</FONT>            properties.putAll( metadataFacet.toProperties() );<a name="line.374"></a>
<FONT color="green">375</FONT>    <a name="line.375"></a>
<FONT color="green">376</FONT>            try<a name="line.376"></a>
<FONT color="green">377</FONT>            {<a name="line.377"></a>
<FONT color="green">378</FONT>                File directory =<a name="line.378"></a>
<FONT color="green">379</FONT>                    new File( getMetadataDirectory( repositoryId, metadataFacet.getFacetId() ), metadataFacet.getName() );<a name="line.379"></a>
<FONT color="green">380</FONT>                writeProperties( properties, directory, METADATA_KEY );<a name="line.380"></a>
<FONT color="green">381</FONT>            }<a name="line.381"></a>
<FONT color="green">382</FONT>            catch ( IOException e )<a name="line.382"></a>
<FONT color="green">383</FONT>            {<a name="line.383"></a>
<FONT color="green">384</FONT>                // TODO!<a name="line.384"></a>
<FONT color="green">385</FONT>                log.error( e.getMessage(), e );<a name="line.385"></a>
<FONT color="green">386</FONT>            }<a name="line.386"></a>
<FONT color="green">387</FONT>        }<a name="line.387"></a>
<FONT color="green">388</FONT>    <a name="line.388"></a>
<FONT color="green">389</FONT>        public void removeMetadataFacets( String repositoryId, String facetId )<a name="line.389"></a>
<FONT color="green">390</FONT>        {<a name="line.390"></a>
<FONT color="green">391</FONT>            File dir = getMetadataDirectory( repositoryId, facetId );<a name="line.391"></a>
<FONT color="green">392</FONT>            if ( !FileUtils.deleteQuietly( dir ) )<a name="line.392"></a>
<FONT color="green">393</FONT>            {<a name="line.393"></a>
<FONT color="green">394</FONT>                log.error( "Cannot delete the metadata repository {}", dir );<a name="line.394"></a>
<FONT color="green">395</FONT>            }<a name="line.395"></a>
<FONT color="green">396</FONT>        }<a name="line.396"></a>
<FONT color="green">397</FONT>    <a name="line.397"></a>
<FONT color="green">398</FONT>        public void removeMetadataFacet( String repoId, String facetId, String name )<a name="line.398"></a>
<FONT color="green">399</FONT>        {<a name="line.399"></a>
<FONT color="green">400</FONT>            File dir = new File( getMetadataDirectory( repoId, facetId ), name );<a name="line.400"></a>
<FONT color="green">401</FONT>            if ( !FileUtils.deleteQuietly( dir ) )<a name="line.401"></a>
<FONT color="green">402</FONT>            {<a name="line.402"></a>
<FONT color="green">403</FONT>                log.error( "Cannot delete the metadata repository {}", dir );<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>    <a name="line.406"></a>
<FONT color="green">407</FONT>        public List&lt;ArtifactMetadata&gt; getArtifactsByDateRange( String repoId, Date startTime, Date endTime )<a name="line.407"></a>
<FONT color="green">408</FONT>        {<a name="line.408"></a>
<FONT color="green">409</FONT>            // TODO: this is quite slow - if we are to persist with this repository implementation we should build an index<a name="line.409"></a>
<FONT color="green">410</FONT>            //  of this information (eg. in Lucene, as before)<a name="line.410"></a>
<FONT color="green">411</FONT>    <a name="line.411"></a>
<FONT color="green">412</FONT>            List&lt;ArtifactMetadata&gt; artifacts = new ArrayList&lt;ArtifactMetadata&gt;();<a name="line.412"></a>
<FONT color="green">413</FONT>            for ( String ns : getRootNamespaces( repoId ) )<a name="line.413"></a>
<FONT color="green">414</FONT>            {<a name="line.414"></a>
<FONT color="green">415</FONT>                getArtifactsByDateRange( artifacts, repoId, ns, startTime, endTime );<a name="line.415"></a>
<FONT color="green">416</FONT>            }<a name="line.416"></a>
<FONT color="green">417</FONT>            Collections.sort( artifacts, new ArtifactComparator() );<a name="line.417"></a>
<FONT color="green">418</FONT>            return artifacts;<a name="line.418"></a>
<FONT color="green">419</FONT>        }<a name="line.419"></a>
<FONT color="green">420</FONT>    <a name="line.420"></a>
<FONT color="green">421</FONT>        private void getArtifactsByDateRange( List&lt;ArtifactMetadata&gt; artifacts, String repoId, String ns, Date startTime,<a name="line.421"></a>
<FONT color="green">422</FONT>                                              Date endTime )<a name="line.422"></a>
<FONT color="green">423</FONT>        {<a name="line.423"></a>
<FONT color="green">424</FONT>            for ( String namespace : getNamespaces( repoId, ns ) )<a name="line.424"></a>
<FONT color="green">425</FONT>            {<a name="line.425"></a>
<FONT color="green">426</FONT>                getArtifactsByDateRange( artifacts, repoId, ns + "." + namespace, startTime, endTime );<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>            for ( String project : getProjects( repoId, ns ) )<a name="line.429"></a>
<FONT color="green">430</FONT>            {<a name="line.430"></a>
<FONT color="green">431</FONT>                for ( String version : getProjectVersions( repoId, ns, project ) )<a name="line.431"></a>
<FONT color="green">432</FONT>                {<a name="line.432"></a>
<FONT color="green">433</FONT>                    for ( ArtifactMetadata artifact : getArtifacts( repoId, ns, project, version ) )<a name="line.433"></a>
<FONT color="green">434</FONT>                    {<a name="line.434"></a>
<FONT color="green">435</FONT>                        if ( startTime == null || startTime.before( artifact.getWhenGathered() ) )<a name="line.435"></a>
<FONT color="green">436</FONT>                        {<a name="line.436"></a>
<FONT color="green">437</FONT>                            if ( endTime == null || endTime.after( artifact.getWhenGathered() ) )<a name="line.437"></a>
<FONT color="green">438</FONT>                            {<a name="line.438"></a>
<FONT color="green">439</FONT>                                artifacts.add( artifact );<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>                    }<a name="line.442"></a>
<FONT color="green">443</FONT>                }<a name="line.443"></a>
<FONT color="green">444</FONT>            }<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>        public Collection&lt;ArtifactMetadata&gt; getArtifacts( String repoId, String namespace, String projectId,<a name="line.447"></a>
<FONT color="green">448</FONT>                                                          String projectVersion )<a name="line.448"></a>
<FONT color="green">449</FONT>        {<a name="line.449"></a>
<FONT color="green">450</FONT>            Map&lt;String, ArtifactMetadata&gt; artifacts = new HashMap&lt;String, ArtifactMetadata&gt;();<a name="line.450"></a>
<FONT color="green">451</FONT>    <a name="line.451"></a>
<FONT color="green">452</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );<a name="line.452"></a>
<FONT color="green">453</FONT>    <a name="line.453"></a>
<FONT color="green">454</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.454"></a>
<FONT color="green">455</FONT>    <a name="line.455"></a>
<FONT color="green">456</FONT>            for ( Map.Entry entry : properties.entrySet() )<a name="line.456"></a>
<FONT color="green">457</FONT>            {<a name="line.457"></a>
<FONT color="green">458</FONT>                String name = (String) entry.getKey();<a name="line.458"></a>
<FONT color="green">459</FONT>                StringTokenizer tok = new StringTokenizer( name, ":" );<a name="line.459"></a>
<FONT color="green">460</FONT>                if ( tok.hasMoreTokens() &amp;&amp; "artifact".equals( tok.nextToken() ) )<a name="line.460"></a>
<FONT color="green">461</FONT>                {<a name="line.461"></a>
<FONT color="green">462</FONT>                    String field = tok.nextToken();<a name="line.462"></a>
<FONT color="green">463</FONT>                    String id = tok.nextToken();<a name="line.463"></a>
<FONT color="green">464</FONT>    <a name="line.464"></a>
<FONT color="green">465</FONT>                    ArtifactMetadata artifact = artifacts.get( id );<a name="line.465"></a>
<FONT color="green">466</FONT>                    if ( artifact == null )<a name="line.466"></a>
<FONT color="green">467</FONT>                    {<a name="line.467"></a>
<FONT color="green">468</FONT>                        artifact = new ArtifactMetadata();<a name="line.468"></a>
<FONT color="green">469</FONT>                        artifact.setRepositoryId( repoId );<a name="line.469"></a>
<FONT color="green">470</FONT>                        artifact.setNamespace( namespace );<a name="line.470"></a>
<FONT color="green">471</FONT>                        artifact.setProject( projectId );<a name="line.471"></a>
<FONT color="green">472</FONT>                        artifact.setProjectVersion( projectVersion );<a name="line.472"></a>
<FONT color="green">473</FONT>                        artifact.setVersion( projectVersion );<a name="line.473"></a>
<FONT color="green">474</FONT>                        artifact.setId( id );<a name="line.474"></a>
<FONT color="green">475</FONT>                        artifacts.put( id, artifact );<a name="line.475"></a>
<FONT color="green">476</FONT>                    }<a name="line.476"></a>
<FONT color="green">477</FONT>    <a name="line.477"></a>
<FONT color="green">478</FONT>                    String value = (String) entry.getValue();<a name="line.478"></a>
<FONT color="green">479</FONT>                    if ( "updated".equals( field ) )<a name="line.479"></a>
<FONT color="green">480</FONT>                    {<a name="line.480"></a>
<FONT color="green">481</FONT>                        artifact.setFileLastModified( Long.parseLong( value ) );<a name="line.481"></a>
<FONT color="green">482</FONT>                    }<a name="line.482"></a>
<FONT color="green">483</FONT>                    else if ( "size".equals( field ) )<a name="line.483"></a>
<FONT color="green">484</FONT>                    {<a name="line.484"></a>
<FONT color="green">485</FONT>                        artifact.setSize( Long.valueOf( value ) );<a name="line.485"></a>
<FONT color="green">486</FONT>                    }<a name="line.486"></a>
<FONT color="green">487</FONT>                    else if ( "whenGathered".equals( field ) )<a name="line.487"></a>
<FONT color="green">488</FONT>                    {<a name="line.488"></a>
<FONT color="green">489</FONT>                        artifact.setWhenGathered( new Date( Long.parseLong( value ) ) );<a name="line.489"></a>
<FONT color="green">490</FONT>                    }<a name="line.490"></a>
<FONT color="green">491</FONT>                    else if ( "version".equals( field ) )<a name="line.491"></a>
<FONT color="green">492</FONT>                    {<a name="line.492"></a>
<FONT color="green">493</FONT>                        artifact.setVersion( value );<a name="line.493"></a>
<FONT color="green">494</FONT>                    }<a name="line.494"></a>
<FONT color="green">495</FONT>                    else if ( "md5".equals( field ) )<a name="line.495"></a>
<FONT color="green">496</FONT>                    {<a name="line.496"></a>
<FONT color="green">497</FONT>                        artifact.setMd5( value );<a name="line.497"></a>
<FONT color="green">498</FONT>                    }<a name="line.498"></a>
<FONT color="green">499</FONT>                    else if ( "sha1".equals( field ) )<a name="line.499"></a>
<FONT color="green">500</FONT>                    {<a name="line.500"></a>
<FONT color="green">501</FONT>                        artifact.setSha1( value );<a name="line.501"></a>
<FONT color="green">502</FONT>                    }<a name="line.502"></a>
<FONT color="green">503</FONT>                    else if ( "facetIds".equals( field ) )<a name="line.503"></a>
<FONT color="green">504</FONT>                    {<a name="line.504"></a>
<FONT color="green">505</FONT>                        if ( value.length() &gt; 0 )<a name="line.505"></a>
<FONT color="green">506</FONT>                        {<a name="line.506"></a>
<FONT color="green">507</FONT>                            String propertyPrefix = "artifact:facet:" + id + ":";<a name="line.507"></a>
<FONT color="green">508</FONT>                            for ( String facetId : value.split( "," ) )<a name="line.508"></a>
<FONT color="green">509</FONT>                            {<a name="line.509"></a>
<FONT color="green">510</FONT>                                MetadataFacetFactory factory = metadataFacetFactories.get( facetId );<a name="line.510"></a>
<FONT color="green">511</FONT>                                if ( factory == null )<a name="line.511"></a>
<FONT color="green">512</FONT>                                {<a name="line.512"></a>
<FONT color="green">513</FONT>                                    log.error( "Attempted to load unknown artifact metadata facet: " + facetId );<a name="line.513"></a>
<FONT color="green">514</FONT>                                }<a name="line.514"></a>
<FONT color="green">515</FONT>                                else<a name="line.515"></a>
<FONT color="green">516</FONT>                                {<a name="line.516"></a>
<FONT color="green">517</FONT>                                    MetadataFacet facet = factory.createMetadataFacet();<a name="line.517"></a>
<FONT color="green">518</FONT>                                    String prefix = propertyPrefix + facet.getFacetId();<a name="line.518"></a>
<FONT color="green">519</FONT>                                    Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();<a name="line.519"></a>
<FONT color="green">520</FONT>                                    for ( Object key : new ArrayList( properties.keySet() ) )<a name="line.520"></a>
<FONT color="green">521</FONT>                                    {<a name="line.521"></a>
<FONT color="green">522</FONT>                                        String property = (String) key;<a name="line.522"></a>
<FONT color="green">523</FONT>                                        if ( property.startsWith( prefix ) )<a name="line.523"></a>
<FONT color="green">524</FONT>                                        {<a name="line.524"></a>
<FONT color="green">525</FONT>                                            map.put( property.substring( prefix.length() + 1 ),<a name="line.525"></a>
<FONT color="green">526</FONT>                                                     properties.getProperty( property ) );<a name="line.526"></a>
<FONT color="green">527</FONT>                                        }<a name="line.527"></a>
<FONT color="green">528</FONT>                                    }<a name="line.528"></a>
<FONT color="green">529</FONT>                                    facet.fromProperties( map );<a name="line.529"></a>
<FONT color="green">530</FONT>                                    artifact.addFacet( facet );<a name="line.530"></a>
<FONT color="green">531</FONT>                                }<a name="line.531"></a>
<FONT color="green">532</FONT>                            }<a name="line.532"></a>
<FONT color="green">533</FONT>                        }<a name="line.533"></a>
<FONT color="green">534</FONT>    <a name="line.534"></a>
<FONT color="green">535</FONT>                        updateArtifactFacets( artifact, properties );<a name="line.535"></a>
<FONT color="green">536</FONT>                    }<a name="line.536"></a>
<FONT color="green">537</FONT>                }<a name="line.537"></a>
<FONT color="green">538</FONT>            }<a name="line.538"></a>
<FONT color="green">539</FONT>            return artifacts.values();<a name="line.539"></a>
<FONT color="green">540</FONT>        }<a name="line.540"></a>
<FONT color="green">541</FONT>    <a name="line.541"></a>
<FONT color="green">542</FONT>        public void save()<a name="line.542"></a>
<FONT color="green">543</FONT>        {<a name="line.543"></a>
<FONT color="green">544</FONT>            // it's all instantly persisted<a name="line.544"></a>
<FONT color="green">545</FONT>        }<a name="line.545"></a>
<FONT color="green">546</FONT>    <a name="line.546"></a>
<FONT color="green">547</FONT>        public void close()<a name="line.547"></a>
<FONT color="green">548</FONT>        {<a name="line.548"></a>
<FONT color="green">549</FONT>            // nothing additional to close<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>        public void revert()<a name="line.552"></a>
<FONT color="green">553</FONT>        {<a name="line.553"></a>
<FONT color="green">554</FONT>            log.warn( "Attempted to revert a session, but the file-based repository storage doesn't support it" );<a name="line.554"></a>
<FONT color="green">555</FONT>        }<a name="line.555"></a>
<FONT color="green">556</FONT>    <a name="line.556"></a>
<FONT color="green">557</FONT>        public boolean canObtainAccess( Class&lt;?&gt; aClass )<a name="line.557"></a>
<FONT color="green">558</FONT>        {<a name="line.558"></a>
<FONT color="green">559</FONT>            return false;<a name="line.559"></a>
<FONT color="green">560</FONT>        }<a name="line.560"></a>
<FONT color="green">561</FONT>    <a name="line.561"></a>
<FONT color="green">562</FONT>        public &lt;T&gt;T obtainAccess( Class&lt;T&gt; aClass )<a name="line.562"></a>
<FONT color="green">563</FONT>        {<a name="line.563"></a>
<FONT color="green">564</FONT>            throw new IllegalArgumentException(<a name="line.564"></a>
<FONT color="green">565</FONT>                "Access using " + aClass + " is not supported on the file metadata storage" );<a name="line.565"></a>
<FONT color="green">566</FONT>        }<a name="line.566"></a>
<FONT color="green">567</FONT>    <a name="line.567"></a>
<FONT color="green">568</FONT>        private void updateArtifactFacets( ArtifactMetadata artifact, Properties properties )<a name="line.568"></a>
<FONT color="green">569</FONT>        {<a name="line.569"></a>
<FONT color="green">570</FONT>            String propertyPrefix = "artifact:facet:" + artifact.getId() + ":";<a name="line.570"></a>
<FONT color="green">571</FONT>            for ( MetadataFacet facet : artifact.getFacetList() )<a name="line.571"></a>
<FONT color="green">572</FONT>            {<a name="line.572"></a>
<FONT color="green">573</FONT>                for ( Map.Entry&lt;String, String&gt; e : facet.toProperties().entrySet() )<a name="line.573"></a>
<FONT color="green">574</FONT>                {<a name="line.574"></a>
<FONT color="green">575</FONT>                    String key = propertyPrefix + facet.getFacetId() + ":" + e.getKey();<a name="line.575"></a>
<FONT color="green">576</FONT>                    properties.setProperty( key, e.getValue() );<a name="line.576"></a>
<FONT color="green">577</FONT>                }<a name="line.577"></a>
<FONT color="green">578</FONT>            }<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 Collection&lt;String&gt; getRepositories()<a name="line.581"></a>
<FONT color="green">582</FONT>        {<a name="line.582"></a>
<FONT color="green">583</FONT>            List&lt;String&gt; repositories = new ArrayList&lt;String&gt;();<a name="line.583"></a>
<FONT color="green">584</FONT>            for ( ManagedRepositoryConfiguration managedRepositoryConfiguration : configuration.getConfiguration().getManagedRepositories() )<a name="line.584"></a>
<FONT color="green">585</FONT>            {<a name="line.585"></a>
<FONT color="green">586</FONT>                repositories.add( managedRepositoryConfiguration.getId() );<a name="line.586"></a>
<FONT color="green">587</FONT>            }<a name="line.587"></a>
<FONT color="green">588</FONT>            return repositories;<a name="line.588"></a>
<FONT color="green">589</FONT>        }<a name="line.589"></a>
<FONT color="green">590</FONT>    <a name="line.590"></a>
<FONT color="green">591</FONT>        public List&lt;ArtifactMetadata&gt; getArtifactsByChecksum( String repositoryId, String checksum )<a name="line.591"></a>
<FONT color="green">592</FONT>        {<a name="line.592"></a>
<FONT color="green">593</FONT>            // TODO: this is quite slow - if we are to persist with this repository implementation we should build an index<a name="line.593"></a>
<FONT color="green">594</FONT>            //  of this information (eg. in Lucene, as before)<a name="line.594"></a>
<FONT color="green">595</FONT>            // alternatively, we could build a referential tree in the content repository, however it would need some levels<a name="line.595"></a>
<FONT color="green">596</FONT>            // of depth to avoid being too broad to be useful (eg. /repository/checksums/a/ab/abcdef1234567)<a name="line.596"></a>
<FONT color="green">597</FONT>    <a name="line.597"></a>
<FONT color="green">598</FONT>            List&lt;ArtifactMetadata&gt; artifacts = new ArrayList&lt;ArtifactMetadata&gt;();<a name="line.598"></a>
<FONT color="green">599</FONT>            for ( String ns : getRootNamespaces( repositoryId ) )<a name="line.599"></a>
<FONT color="green">600</FONT>            {<a name="line.600"></a>
<FONT color="green">601</FONT>                getArtifactsByChecksum( artifacts, repositoryId, ns, checksum );<a name="line.601"></a>
<FONT color="green">602</FONT>            }<a name="line.602"></a>
<FONT color="green">603</FONT>            return artifacts;<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>        public void removeNamespace( String repositoryId, String project )<a name="line.606"></a>
<FONT color="green">607</FONT>            throws MetadataRepositoryException<a name="line.607"></a>
<FONT color="green">608</FONT>        {<a name="line.608"></a>
<FONT color="green">609</FONT>            try<a name="line.609"></a>
<FONT color="green">610</FONT>            {<a name="line.610"></a>
<FONT color="green">611</FONT>                File namespaceDirectory = new File( getDirectory( repositoryId ), project );<a name="line.611"></a>
<FONT color="green">612</FONT>                FileUtils.deleteDirectory( namespaceDirectory );<a name="line.612"></a>
<FONT color="green">613</FONT>                //Properties properties = new Properties();<a name="line.613"></a>
<FONT color="green">614</FONT>                //properties.setProperty( "namespace", namespace );<a name="line.614"></a>
<FONT color="green">615</FONT>                //writeProperties( properties, namespaceDirectory, NAMESPACE_METADATA_KEY );<a name="line.615"></a>
<FONT color="green">616</FONT>    <a name="line.616"></a>
<FONT color="green">617</FONT>            }<a name="line.617"></a>
<FONT color="green">618</FONT>            catch ( IOException e )<a name="line.618"></a>
<FONT color="green">619</FONT>            {<a name="line.619"></a>
<FONT color="green">620</FONT>                throw new MetadataRepositoryException( e.getMessage(), e );<a name="line.620"></a>
<FONT color="green">621</FONT>            }<a name="line.621"></a>
<FONT color="green">622</FONT>        }<a name="line.622"></a>
<FONT color="green">623</FONT>    <a name="line.623"></a>
<FONT color="green">624</FONT>        public void removeArtifact( ArtifactMetadata artifactMetadata, String baseVersion )<a name="line.624"></a>
<FONT color="green">625</FONT>            throws MetadataRepositoryException<a name="line.625"></a>
<FONT color="green">626</FONT>        {<a name="line.626"></a>
<FONT color="green">627</FONT>    <a name="line.627"></a>
<FONT color="green">628</FONT>            File directory = new File( getDirectory( artifactMetadata.getRepositoryId() ),<a name="line.628"></a>
<FONT color="green">629</FONT>                                       artifactMetadata.getNamespace() + "/" + artifactMetadata.getProject() + "/"<a name="line.629"></a>
<FONT color="green">630</FONT>                                           + baseVersion );<a name="line.630"></a>
<FONT color="green">631</FONT>    <a name="line.631"></a>
<FONT color="green">632</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.632"></a>
<FONT color="green">633</FONT>    <a name="line.633"></a>
<FONT color="green">634</FONT>            String id = artifactMetadata.getId();<a name="line.634"></a>
<FONT color="green">635</FONT>    <a name="line.635"></a>
<FONT color="green">636</FONT>            properties.remove( "artifact:updated:" + id );<a name="line.636"></a>
<FONT color="green">637</FONT>            properties.remove( "artifact:whenGathered:" + id );<a name="line.637"></a>
<FONT color="green">638</FONT>            properties.remove( "artifact:size:" + id );<a name="line.638"></a>
<FONT color="green">639</FONT>            properties.remove( "artifact:md5:" + id );<a name="line.639"></a>
<FONT color="green">640</FONT>            properties.remove( "artifact:sha1:" + id );<a name="line.640"></a>
<FONT color="green">641</FONT>            properties.remove( "artifact:version:" + id );<a name="line.641"></a>
<FONT color="green">642</FONT>            properties.remove( "artifact:facetIds:" + id );<a name="line.642"></a>
<FONT color="green">643</FONT>    <a name="line.643"></a>
<FONT color="green">644</FONT>            String prefix = "artifact:facet:" + id + ":";<a name="line.644"></a>
<FONT color="green">645</FONT>            for ( Object key : new ArrayList&lt;Object&gt;( properties.keySet() ) )<a name="line.645"></a>
<FONT color="green">646</FONT>            {<a name="line.646"></a>
<FONT color="green">647</FONT>                String property = (String) key;<a name="line.647"></a>
<FONT color="green">648</FONT>                if ( property.startsWith( prefix ) )<a name="line.648"></a>
<FONT color="green">649</FONT>                {<a name="line.649"></a>
<FONT color="green">650</FONT>                    properties.remove( property );<a name="line.650"></a>
<FONT color="green">651</FONT>                }<a name="line.651"></a>
<FONT color="green">652</FONT>            }<a name="line.652"></a>
<FONT color="green">653</FONT>    <a name="line.653"></a>
<FONT color="green">654</FONT>            try<a name="line.654"></a>
<FONT color="green">655</FONT>            {<a name="line.655"></a>
<FONT color="green">656</FONT>                writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );<a name="line.656"></a>
<FONT color="green">657</FONT>            }<a name="line.657"></a>
<FONT color="green">658</FONT>            catch ( IOException e )<a name="line.658"></a>
<FONT color="green">659</FONT>            {<a name="line.659"></a>
<FONT color="green">660</FONT>                // TODO<a name="line.660"></a>
<FONT color="green">661</FONT>                log.error( e.getMessage(), e );<a name="line.661"></a>
<FONT color="green">662</FONT>            }<a name="line.662"></a>
<FONT color="green">663</FONT>    <a name="line.663"></a>
<FONT color="green">664</FONT>        }<a name="line.664"></a>
<FONT color="green">665</FONT>    <a name="line.665"></a>
<FONT color="green">666</FONT>        public void removeArtifact( String repoId, String namespace, String project, String version, String id )<a name="line.666"></a>
<FONT color="green">667</FONT>        {<a name="line.667"></a>
<FONT color="green">668</FONT>    <a name="line.668"></a>
<FONT color="green">669</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + project + "/" + version );<a name="line.669"></a>
<FONT color="green">670</FONT>    <a name="line.670"></a>
<FONT color="green">671</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.671"></a>
<FONT color="green">672</FONT>    <a name="line.672"></a>
<FONT color="green">673</FONT>            properties.remove( "artifact:updated:" + id );<a name="line.673"></a>
<FONT color="green">674</FONT>            properties.remove( "artifact:whenGathered:" + id );<a name="line.674"></a>
<FONT color="green">675</FONT>            properties.remove( "artifact:size:" + id );<a name="line.675"></a>
<FONT color="green">676</FONT>            properties.remove( "artifact:md5:" + id );<a name="line.676"></a>
<FONT color="green">677</FONT>            properties.remove( "artifact:sha1:" + id );<a name="line.677"></a>
<FONT color="green">678</FONT>            properties.remove( "artifact:version:" + id );<a name="line.678"></a>
<FONT color="green">679</FONT>            properties.remove( "artifact:facetIds:" + id );<a name="line.679"></a>
<FONT color="green">680</FONT>    <a name="line.680"></a>
<FONT color="green">681</FONT>            String prefix = "artifact:facet:" + id + ":";<a name="line.681"></a>
<FONT color="green">682</FONT>            for ( Object key : new ArrayList&lt;Object&gt;( properties.keySet() ) )<a name="line.682"></a>
<FONT color="green">683</FONT>            {<a name="line.683"></a>
<FONT color="green">684</FONT>                String property = (String) key;<a name="line.684"></a>
<FONT color="green">685</FONT>                if ( property.startsWith( prefix ) )<a name="line.685"></a>
<FONT color="green">686</FONT>                {<a name="line.686"></a>
<FONT color="green">687</FONT>                    properties.remove( property );<a name="line.687"></a>
<FONT color="green">688</FONT>                }<a name="line.688"></a>
<FONT color="green">689</FONT>            }<a name="line.689"></a>
<FONT color="green">690</FONT>    <a name="line.690"></a>
<FONT color="green">691</FONT>            try<a name="line.691"></a>
<FONT color="green">692</FONT>            {<a name="line.692"></a>
<FONT color="green">693</FONT>    <a name="line.693"></a>
<FONT color="green">694</FONT>                FileUtils.deleteDirectory( directory );<a name="line.694"></a>
<FONT color="green">695</FONT>    <a name="line.695"></a>
<FONT color="green">696</FONT>                //writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );<a name="line.696"></a>
<FONT color="green">697</FONT>            }<a name="line.697"></a>
<FONT color="green">698</FONT>            catch ( IOException e )<a name="line.698"></a>
<FONT color="green">699</FONT>            {<a name="line.699"></a>
<FONT color="green">700</FONT>                // TODO<a name="line.700"></a>
<FONT color="green">701</FONT>                log.error( e.getMessage(), e );<a name="line.701"></a>
<FONT color="green">702</FONT>            }<a name="line.702"></a>
<FONT color="green">703</FONT>        }<a name="line.703"></a>
<FONT color="green">704</FONT>    <a name="line.704"></a>
<FONT color="green">705</FONT>        /**<a name="line.705"></a>
<FONT color="green">706</FONT>         * FIXME implements this !!!!<a name="line.706"></a>
<FONT color="green">707</FONT>         *<a name="line.707"></a>
<FONT color="green">708</FONT>         * @param repositoryId<a name="line.708"></a>
<FONT color="green">709</FONT>         * @param namespace<a name="line.709"></a>
<FONT color="green">710</FONT>         * @param project<a name="line.710"></a>
<FONT color="green">711</FONT>         * @param projectVersion<a name="line.711"></a>
<FONT color="green">712</FONT>         * @param metadataFacet  will remove artifacts which have this {@link MetadataFacet} using equals<a name="line.712"></a>
<FONT color="green">713</FONT>         * @throws MetadataRepositoryException<a name="line.713"></a>
<FONT color="green">714</FONT>         */<a name="line.714"></a>
<FONT color="green">715</FONT>        public void removeArtifact( String repositoryId, String namespace, String project, String projectVersion,<a name="line.715"></a>
<FONT color="green">716</FONT>                                    MetadataFacet metadataFacet )<a name="line.716"></a>
<FONT color="green">717</FONT>            throws MetadataRepositoryException<a name="line.717"></a>
<FONT color="green">718</FONT>        {<a name="line.718"></a>
<FONT color="green">719</FONT>            throw new UnsupportedOperationException( "not implemented" );<a name="line.719"></a>
<FONT color="green">720</FONT>        }<a name="line.720"></a>
<FONT color="green">721</FONT>    <a name="line.721"></a>
<FONT color="green">722</FONT>        public void removeRepository( String repoId )<a name="line.722"></a>
<FONT color="green">723</FONT>        {<a name="line.723"></a>
<FONT color="green">724</FONT>            File dir = getDirectory( repoId );<a name="line.724"></a>
<FONT color="green">725</FONT>            if ( !FileUtils.deleteQuietly( dir ) )<a name="line.725"></a>
<FONT color="green">726</FONT>            {<a name="line.726"></a>
<FONT color="green">727</FONT>                log.error( "Cannot delete repository {}", dir );<a name="line.727"></a>
<FONT color="green">728</FONT>            }<a name="line.728"></a>
<FONT color="green">729</FONT>        }<a name="line.729"></a>
<FONT color="green">730</FONT>    <a name="line.730"></a>
<FONT color="green">731</FONT>        private void getArtifactsByChecksum( List&lt;ArtifactMetadata&gt; artifacts, String repositoryId, String ns,<a name="line.731"></a>
<FONT color="green">732</FONT>                                             String checksum )<a name="line.732"></a>
<FONT color="green">733</FONT>        {<a name="line.733"></a>
<FONT color="green">734</FONT>            for ( String namespace : getNamespaces( repositoryId, ns ) )<a name="line.734"></a>
<FONT color="green">735</FONT>            {<a name="line.735"></a>
<FONT color="green">736</FONT>                getArtifactsByChecksum( artifacts, repositoryId, ns + "." + namespace, checksum );<a name="line.736"></a>
<FONT color="green">737</FONT>            }<a name="line.737"></a>
<FONT color="green">738</FONT>    <a name="line.738"></a>
<FONT color="green">739</FONT>            for ( String project : getProjects( repositoryId, ns ) )<a name="line.739"></a>
<FONT color="green">740</FONT>            {<a name="line.740"></a>
<FONT color="green">741</FONT>                for ( String version : getProjectVersions( repositoryId, ns, project ) )<a name="line.741"></a>
<FONT color="green">742</FONT>                {<a name="line.742"></a>
<FONT color="green">743</FONT>                    for ( ArtifactMetadata artifact : getArtifacts( repositoryId, ns, project, version ) )<a name="line.743"></a>
<FONT color="green">744</FONT>                    {<a name="line.744"></a>
<FONT color="green">745</FONT>                        if ( checksum.equals( artifact.getMd5() ) || checksum.equals( artifact.getSha1() ) )<a name="line.745"></a>
<FONT color="green">746</FONT>                        {<a name="line.746"></a>
<FONT color="green">747</FONT>                            artifacts.add( artifact );<a name="line.747"></a>
<FONT color="green">748</FONT>                        }<a name="line.748"></a>
<FONT color="green">749</FONT>                    }<a name="line.749"></a>
<FONT color="green">750</FONT>                }<a name="line.750"></a>
<FONT color="green">751</FONT>            }<a name="line.751"></a>
<FONT color="green">752</FONT>        }<a name="line.752"></a>
<FONT color="green">753</FONT>    <a name="line.753"></a>
<FONT color="green">754</FONT>        private File getMetadataDirectory( String repoId, String facetId )<a name="line.754"></a>
<FONT color="green">755</FONT>        {<a name="line.755"></a>
<FONT color="green">756</FONT>            return new File( getBaseDirectory( repoId ), "facets/" + facetId );<a name="line.756"></a>
<FONT color="green">757</FONT>        }<a name="line.757"></a>
<FONT color="green">758</FONT>    <a name="line.758"></a>
<FONT color="green">759</FONT>        private String join( Collection&lt;String&gt; ids )<a name="line.759"></a>
<FONT color="green">760</FONT>        {<a name="line.760"></a>
<FONT color="green">761</FONT>            if ( ids != null &amp;&amp; !ids.isEmpty() )<a name="line.761"></a>
<FONT color="green">762</FONT>            {<a name="line.762"></a>
<FONT color="green">763</FONT>                StringBuilder s = new StringBuilder();<a name="line.763"></a>
<FONT color="green">764</FONT>                for ( String id : ids )<a name="line.764"></a>
<FONT color="green">765</FONT>                {<a name="line.765"></a>
<FONT color="green">766</FONT>                    s.append( id );<a name="line.766"></a>
<FONT color="green">767</FONT>                    s.append( "," );<a name="line.767"></a>
<FONT color="green">768</FONT>                }<a name="line.768"></a>
<FONT color="green">769</FONT>                return s.substring( 0, s.length() - 1 );<a name="line.769"></a>
<FONT color="green">770</FONT>            }<a name="line.770"></a>
<FONT color="green">771</FONT>            return "";<a name="line.771"></a>
<FONT color="green">772</FONT>        }<a name="line.772"></a>
<FONT color="green">773</FONT>    <a name="line.773"></a>
<FONT color="green">774</FONT>        private void setProperty( Properties properties, String name, String value )<a name="line.774"></a>
<FONT color="green">775</FONT>        {<a name="line.775"></a>
<FONT color="green">776</FONT>            if ( value != null )<a name="line.776"></a>
<FONT color="green">777</FONT>            {<a name="line.777"></a>
<FONT color="green">778</FONT>                properties.setProperty( name, value );<a name="line.778"></a>
<FONT color="green">779</FONT>            }<a name="line.779"></a>
<FONT color="green">780</FONT>        }<a name="line.780"></a>
<FONT color="green">781</FONT>    <a name="line.781"></a>
<FONT color="green">782</FONT>        public void updateArtifact( String repoId, String namespace, String projectId, String projectVersion,<a name="line.782"></a>
<FONT color="green">783</FONT>                                    ArtifactMetadata artifact )<a name="line.783"></a>
<FONT color="green">784</FONT>        {<a name="line.784"></a>
<FONT color="green">785</FONT>            ProjectVersionMetadata metadata = new ProjectVersionMetadata();<a name="line.785"></a>
<FONT color="green">786</FONT>            metadata.setId( projectVersion );<a name="line.786"></a>
<FONT color="green">787</FONT>            updateProjectVersion( repoId, namespace, projectId, metadata );<a name="line.787"></a>
<FONT color="green">788</FONT>    <a name="line.788"></a>
<FONT color="green">789</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );<a name="line.789"></a>
<FONT color="green">790</FONT>    <a name="line.790"></a>
<FONT color="green">791</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.791"></a>
<FONT color="green">792</FONT>    <a name="line.792"></a>
<FONT color="green">793</FONT>            clearMetadataFacetProperties( artifact.getFacetList(), properties, "artifact:facet:" + artifact.getId() + ":" );<a name="line.793"></a>
<FONT color="green">794</FONT>    <a name="line.794"></a>
<FONT color="green">795</FONT>            String id = artifact.getId();<a name="line.795"></a>
<FONT color="green">796</FONT>            properties.setProperty( "artifact:updated:" + id, Long.toString( artifact.getFileLastModified().getTime() ) );<a name="line.796"></a>
<FONT color="green">797</FONT>            properties.setProperty( "artifact:whenGathered:" + id, Long.toString( artifact.getWhenGathered().getTime() ) );<a name="line.797"></a>
<FONT color="green">798</FONT>            properties.setProperty( "artifact:size:" + id, Long.toString( artifact.getSize() ) );<a name="line.798"></a>
<FONT color="green">799</FONT>            if ( artifact.getMd5() != null )<a name="line.799"></a>
<FONT color="green">800</FONT>            {<a name="line.800"></a>
<FONT color="green">801</FONT>                properties.setProperty( "artifact:md5:" + id, artifact.getMd5() );<a name="line.801"></a>
<FONT color="green">802</FONT>            }<a name="line.802"></a>
<FONT color="green">803</FONT>            if ( artifact.getSha1() != null )<a name="line.803"></a>
<FONT color="green">804</FONT>            {<a name="line.804"></a>
<FONT color="green">805</FONT>                properties.setProperty( "artifact:sha1:" + id, artifact.getSha1() );<a name="line.805"></a>
<FONT color="green">806</FONT>            }<a name="line.806"></a>
<FONT color="green">807</FONT>            properties.setProperty( "artifact:version:" + id, artifact.getVersion() );<a name="line.807"></a>
<FONT color="green">808</FONT>    <a name="line.808"></a>
<FONT color="green">809</FONT>            Set&lt;String&gt; facetIds = new LinkedHashSet&lt;String&gt;( artifact.getFacetIds() );<a name="line.809"></a>
<FONT color="green">810</FONT>            String property = "artifact:facetIds:" + id;<a name="line.810"></a>
<FONT color="green">811</FONT>            facetIds.addAll( Arrays.asList( properties.getProperty( property, "" ).split( "," ) ) );<a name="line.811"></a>
<FONT color="green">812</FONT>            properties.setProperty( property, join( facetIds ) );<a name="line.812"></a>
<FONT color="green">813</FONT>    <a name="line.813"></a>
<FONT color="green">814</FONT>            updateArtifactFacets( artifact, properties );<a name="line.814"></a>
<FONT color="green">815</FONT>    <a name="line.815"></a>
<FONT color="green">816</FONT>            try<a name="line.816"></a>
<FONT color="green">817</FONT>            {<a name="line.817"></a>
<FONT color="green">818</FONT>                writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );<a name="line.818"></a>
<FONT color="green">819</FONT>            }<a name="line.819"></a>
<FONT color="green">820</FONT>            catch ( IOException e )<a name="line.820"></a>
<FONT color="green">821</FONT>            {<a name="line.821"></a>
<FONT color="green">822</FONT>                // TODO<a name="line.822"></a>
<FONT color="green">823</FONT>                log.error( e.getMessage(), e );<a name="line.823"></a>
<FONT color="green">824</FONT>            }<a name="line.824"></a>
<FONT color="green">825</FONT>        }<a name="line.825"></a>
<FONT color="green">826</FONT>    <a name="line.826"></a>
<FONT color="green">827</FONT>        private Properties readOrCreateProperties( File directory, String propertiesKey )<a name="line.827"></a>
<FONT color="green">828</FONT>        {<a name="line.828"></a>
<FONT color="green">829</FONT>            try<a name="line.829"></a>
<FONT color="green">830</FONT>            {<a name="line.830"></a>
<FONT color="green">831</FONT>                return readProperties( directory, propertiesKey );<a name="line.831"></a>
<FONT color="green">832</FONT>            }<a name="line.832"></a>
<FONT color="green">833</FONT>            catch ( FileNotFoundException e )<a name="line.833"></a>
<FONT color="green">834</FONT>            {<a name="line.834"></a>
<FONT color="green">835</FONT>                // ignore and return new properties<a name="line.835"></a>
<FONT color="green">836</FONT>            }<a name="line.836"></a>
<FONT color="green">837</FONT>            catch ( IOException e )<a name="line.837"></a>
<FONT color="green">838</FONT>            {<a name="line.838"></a>
<FONT color="green">839</FONT>                // TODO<a name="line.839"></a>
<FONT color="green">840</FONT>                log.error( e.getMessage(), e );<a name="line.840"></a>
<FONT color="green">841</FONT>            }<a name="line.841"></a>
<FONT color="green">842</FONT>            return new Properties();<a name="line.842"></a>
<FONT color="green">843</FONT>        }<a name="line.843"></a>
<FONT color="green">844</FONT>    <a name="line.844"></a>
<FONT color="green">845</FONT>        private Properties readProperties( File directory, String propertiesKey )<a name="line.845"></a>
<FONT color="green">846</FONT>            throws IOException<a name="line.846"></a>
<FONT color="green">847</FONT>        {<a name="line.847"></a>
<FONT color="green">848</FONT>            Properties properties = new Properties();<a name="line.848"></a>
<FONT color="green">849</FONT>            FileInputStream in = null;<a name="line.849"></a>
<FONT color="green">850</FONT>            try<a name="line.850"></a>
<FONT color="green">851</FONT>            {<a name="line.851"></a>
<FONT color="green">852</FONT>                in = new FileInputStream( new File( directory, propertiesKey + ".properties" ) );<a name="line.852"></a>
<FONT color="green">853</FONT>                properties.load( in );<a name="line.853"></a>
<FONT color="green">854</FONT>            }<a name="line.854"></a>
<FONT color="green">855</FONT>            finally<a name="line.855"></a>
<FONT color="green">856</FONT>            {<a name="line.856"></a>
<FONT color="green">857</FONT>                IOUtils.closeQuietly( in );<a name="line.857"></a>
<FONT color="green">858</FONT>            }<a name="line.858"></a>
<FONT color="green">859</FONT>            return properties;<a name="line.859"></a>
<FONT color="green">860</FONT>        }<a name="line.860"></a>
<FONT color="green">861</FONT>    <a name="line.861"></a>
<FONT color="green">862</FONT>        public ProjectMetadata getProject( String repoId, String namespace, String projectId )<a name="line.862"></a>
<FONT color="green">863</FONT>        {<a name="line.863"></a>
<FONT color="green">864</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId );<a name="line.864"></a>
<FONT color="green">865</FONT>    <a name="line.865"></a>
<FONT color="green">866</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_METADATA_KEY );<a name="line.866"></a>
<FONT color="green">867</FONT>    <a name="line.867"></a>
<FONT color="green">868</FONT>            ProjectMetadata project = null;<a name="line.868"></a>
<FONT color="green">869</FONT>    <a name="line.869"></a>
<FONT color="green">870</FONT>            String id = properties.getProperty( "id" );<a name="line.870"></a>
<FONT color="green">871</FONT>            if ( id != null )<a name="line.871"></a>
<FONT color="green">872</FONT>            {<a name="line.872"></a>
<FONT color="green">873</FONT>                project = new ProjectMetadata();<a name="line.873"></a>
<FONT color="green">874</FONT>                project.setNamespace( properties.getProperty( "namespace" ) );<a name="line.874"></a>
<FONT color="green">875</FONT>                project.setId( id );<a name="line.875"></a>
<FONT color="green">876</FONT>            }<a name="line.876"></a>
<FONT color="green">877</FONT>    <a name="line.877"></a>
<FONT color="green">878</FONT>            return project;<a name="line.878"></a>
<FONT color="green">879</FONT>        }<a name="line.879"></a>
<FONT color="green">880</FONT>    <a name="line.880"></a>
<FONT color="green">881</FONT>        public ProjectVersionMetadata getProjectVersion( String repoId, String namespace, String projectId,<a name="line.881"></a>
<FONT color="green">882</FONT>                                                         String projectVersion )<a name="line.882"></a>
<FONT color="green">883</FONT>        {<a name="line.883"></a>
<FONT color="green">884</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );<a name="line.884"></a>
<FONT color="green">885</FONT>    <a name="line.885"></a>
<FONT color="green">886</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.886"></a>
<FONT color="green">887</FONT>            String id = properties.getProperty( "id" );<a name="line.887"></a>
<FONT color="green">888</FONT>            ProjectVersionMetadata versionMetadata = null;<a name="line.888"></a>
<FONT color="green">889</FONT>            if ( id != null )<a name="line.889"></a>
<FONT color="green">890</FONT>            {<a name="line.890"></a>
<FONT color="green">891</FONT>                versionMetadata = new ProjectVersionMetadata();<a name="line.891"></a>
<FONT color="green">892</FONT>                versionMetadata.setId( id );<a name="line.892"></a>
<FONT color="green">893</FONT>                versionMetadata.setName( properties.getProperty( "name" ) );<a name="line.893"></a>
<FONT color="green">894</FONT>                versionMetadata.setDescription( properties.getProperty( "description" ) );<a name="line.894"></a>
<FONT color="green">895</FONT>                versionMetadata.setUrl( properties.getProperty( "url" ) );<a name="line.895"></a>
<FONT color="green">896</FONT>                versionMetadata.setIncomplete( Boolean.valueOf( properties.getProperty( "incomplete", "false" ) ) );<a name="line.896"></a>
<FONT color="green">897</FONT>    <a name="line.897"></a>
<FONT color="green">898</FONT>                String scmConnection = properties.getProperty( "scm.connection" );<a name="line.898"></a>
<FONT color="green">899</FONT>                String scmDeveloperConnection = properties.getProperty( "scm.developerConnection" );<a name="line.899"></a>
<FONT color="green">900</FONT>                String scmUrl = properties.getProperty( "scm.url" );<a name="line.900"></a>
<FONT color="green">901</FONT>                if ( scmConnection != null || scmDeveloperConnection != null || scmUrl != null )<a name="line.901"></a>
<FONT color="green">902</FONT>                {<a name="line.902"></a>
<FONT color="green">903</FONT>                    Scm scm = new Scm();<a name="line.903"></a>
<FONT color="green">904</FONT>                    scm.setConnection( scmConnection );<a name="line.904"></a>
<FONT color="green">905</FONT>                    scm.setDeveloperConnection( scmDeveloperConnection );<a name="line.905"></a>
<FONT color="green">906</FONT>                    scm.setUrl( scmUrl );<a name="line.906"></a>
<FONT color="green">907</FONT>                    versionMetadata.setScm( scm );<a name="line.907"></a>
<FONT color="green">908</FONT>                }<a name="line.908"></a>
<FONT color="green">909</FONT>    <a name="line.909"></a>
<FONT color="green">910</FONT>                String ciSystem = properties.getProperty( "ci.system" );<a name="line.910"></a>
<FONT color="green">911</FONT>                String ciUrl = properties.getProperty( "ci.url" );<a name="line.911"></a>
<FONT color="green">912</FONT>                if ( ciSystem != null || ciUrl != null )<a name="line.912"></a>
<FONT color="green">913</FONT>                {<a name="line.913"></a>
<FONT color="green">914</FONT>                    CiManagement ci = new CiManagement();<a name="line.914"></a>
<FONT color="green">915</FONT>                    ci.setSystem( ciSystem );<a name="line.915"></a>
<FONT color="green">916</FONT>                    ci.setUrl( ciUrl );<a name="line.916"></a>
<FONT color="green">917</FONT>                    versionMetadata.setCiManagement( ci );<a name="line.917"></a>
<FONT color="green">918</FONT>                }<a name="line.918"></a>
<FONT color="green">919</FONT>    <a name="line.919"></a>
<FONT color="green">920</FONT>                String issueSystem = properties.getProperty( "issue.system" );<a name="line.920"></a>
<FONT color="green">921</FONT>                String issueUrl = properties.getProperty( "issue.url" );<a name="line.921"></a>
<FONT color="green">922</FONT>                if ( issueSystem != null || issueUrl != null )<a name="line.922"></a>
<FONT color="green">923</FONT>                {<a name="line.923"></a>
<FONT color="green">924</FONT>                    IssueManagement issueManagement = new IssueManagement();<a name="line.924"></a>
<FONT color="green">925</FONT>                    issueManagement.setSystem( issueSystem );<a name="line.925"></a>
<FONT color="green">926</FONT>                    issueManagement.setUrl( issueUrl );<a name="line.926"></a>
<FONT color="green">927</FONT>                    versionMetadata.setIssueManagement( issueManagement );<a name="line.927"></a>
<FONT color="green">928</FONT>                }<a name="line.928"></a>
<FONT color="green">929</FONT>    <a name="line.929"></a>
<FONT color="green">930</FONT>                String orgName = properties.getProperty( "org.name" );<a name="line.930"></a>
<FONT color="green">931</FONT>                String orgUrl = properties.getProperty( "org.url" );<a name="line.931"></a>
<FONT color="green">932</FONT>                if ( orgName != null || orgUrl != null )<a name="line.932"></a>
<FONT color="green">933</FONT>                {<a name="line.933"></a>
<FONT color="green">934</FONT>                    Organization org = new Organization();<a name="line.934"></a>
<FONT color="green">935</FONT>                    org.setName( orgName );<a name="line.935"></a>
<FONT color="green">936</FONT>                    org.setUrl( orgUrl );<a name="line.936"></a>
<FONT color="green">937</FONT>                    versionMetadata.setOrganization( org );<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>                boolean done = false;<a name="line.940"></a>
<FONT color="green">941</FONT>                int i = 0;<a name="line.941"></a>
<FONT color="green">942</FONT>                while ( !done )<a name="line.942"></a>
<FONT color="green">943</FONT>                {<a name="line.943"></a>
<FONT color="green">944</FONT>                    String licenseName = properties.getProperty( "license." + i + ".name" );<a name="line.944"></a>
<FONT color="green">945</FONT>                    String licenseUrl = properties.getProperty( "license." + i + ".url" );<a name="line.945"></a>
<FONT color="green">946</FONT>                    if ( licenseName != null || licenseUrl != null )<a name="line.946"></a>
<FONT color="green">947</FONT>                    {<a name="line.947"></a>
<FONT color="green">948</FONT>                        License license = new License();<a name="line.948"></a>
<FONT color="green">949</FONT>                        license.setName( licenseName );<a name="line.949"></a>
<FONT color="green">950</FONT>                        license.setUrl( licenseUrl );<a name="line.950"></a>
<FONT color="green">951</FONT>                        versionMetadata.addLicense( license );<a name="line.951"></a>
<FONT color="green">952</FONT>                    }<a name="line.952"></a>
<FONT color="green">953</FONT>                    else<a name="line.953"></a>
<FONT color="green">954</FONT>                    {<a name="line.954"></a>
<FONT color="green">955</FONT>                        done = true;<a name="line.955"></a>
<FONT color="green">956</FONT>                    }<a name="line.956"></a>
<FONT color="green">957</FONT>                    i++;<a name="line.957"></a>
<FONT color="green">958</FONT>                }<a name="line.958"></a>
<FONT color="green">959</FONT>    <a name="line.959"></a>
<FONT color="green">960</FONT>                done = false;<a name="line.960"></a>
<FONT color="green">961</FONT>                i = 0;<a name="line.961"></a>
<FONT color="green">962</FONT>                while ( !done )<a name="line.962"></a>
<FONT color="green">963</FONT>                {<a name="line.963"></a>
<FONT color="green">964</FONT>                    String mailingListName = properties.getProperty( "mailingList." + i + ".name" );<a name="line.964"></a>
<FONT color="green">965</FONT>                    if ( mailingListName != null )<a name="line.965"></a>
<FONT color="green">966</FONT>                    {<a name="line.966"></a>
<FONT color="green">967</FONT>                        MailingList mailingList = new MailingList();<a name="line.967"></a>
<FONT color="green">968</FONT>                        mailingList.setName( mailingListName );<a name="line.968"></a>
<FONT color="green">969</FONT>                        mailingList.setMainArchiveUrl( properties.getProperty( "mailingList." + i + ".archive" ) );<a name="line.969"></a>
<FONT color="green">970</FONT>                        String p = properties.getProperty( "mailingList." + i + ".otherArchives" );<a name="line.970"></a>
<FONT color="green">971</FONT>                        if ( p != null &amp;&amp; p.length() &gt; 0 )<a name="line.971"></a>
<FONT color="green">972</FONT>                        {<a name="line.972"></a>
<FONT color="green">973</FONT>                            mailingList.setOtherArchives( Arrays.asList( p.split( "," ) ) );<a name="line.973"></a>
<FONT color="green">974</FONT>                        }<a name="line.974"></a>
<FONT color="green">975</FONT>                        else<a name="line.975"></a>
<FONT color="green">976</FONT>                        {<a name="line.976"></a>
<FONT color="green">977</FONT>                            mailingList.setOtherArchives( Collections.&lt;String&gt;emptyList() );<a name="line.977"></a>
<FONT color="green">978</FONT>                        }<a name="line.978"></a>
<FONT color="green">979</FONT>                        mailingList.setPostAddress( properties.getProperty( "mailingList." + i + ".post" ) );<a name="line.979"></a>
<FONT color="green">980</FONT>                        mailingList.setSubscribeAddress( properties.getProperty( "mailingList." + i + ".subscribe" ) );<a name="line.980"></a>
<FONT color="green">981</FONT>                        mailingList.setUnsubscribeAddress( properties.getProperty( "mailingList." + i + ".unsubscribe" ) );<a name="line.981"></a>
<FONT color="green">982</FONT>                        versionMetadata.addMailingList( mailingList );<a name="line.982"></a>
<FONT color="green">983</FONT>                    }<a name="line.983"></a>
<FONT color="green">984</FONT>                    else<a name="line.984"></a>
<FONT color="green">985</FONT>                    {<a name="line.985"></a>
<FONT color="green">986</FONT>                        done = true;<a name="line.986"></a>
<FONT color="green">987</FONT>                    }<a name="line.987"></a>
<FONT color="green">988</FONT>                    i++;<a name="line.988"></a>
<FONT color="green">989</FONT>                }<a name="line.989"></a>
<FONT color="green">990</FONT>    <a name="line.990"></a>
<FONT color="green">991</FONT>                done = false;<a name="line.991"></a>
<FONT color="green">992</FONT>                i = 0;<a name="line.992"></a>
<FONT color="green">993</FONT>                while ( !done )<a name="line.993"></a>
<FONT color="green">994</FONT>                {<a name="line.994"></a>
<FONT color="green">995</FONT>                    String dependencyArtifactId = properties.getProperty( "dependency." + i + ".artifactId" );<a name="line.995"></a>
<FONT color="green">996</FONT>                    if ( dependencyArtifactId != null )<a name="line.996"></a>
<FONT color="green">997</FONT>                    {<a name="line.997"></a>
<FONT color="green">998</FONT>                        Dependency dependency = new Dependency();<a name="line.998"></a>
<FONT color="green">999</FONT>                        dependency.setArtifactId( dependencyArtifactId );<a name="line.999"></a>
<FONT color="green">1000</FONT>                        dependency.setGroupId( properties.getProperty( "dependency." + i + ".groupId" ) );<a name="line.1000"></a>
<FONT color="green">1001</FONT>                        dependency.setClassifier( properties.getProperty( "dependency." + i + ".classifier" ) );<a name="line.1001"></a>
<FONT color="green">1002</FONT>                        dependency.setOptional(<a name="line.1002"></a>
<FONT color="green">1003</FONT>                            Boolean.valueOf( properties.getProperty( "dependency." + i + ".optional" ) ) );<a name="line.1003"></a>
<FONT color="green">1004</FONT>                        dependency.setScope( properties.getProperty( "dependency." + i + ".scope" ) );<a name="line.1004"></a>
<FONT color="green">1005</FONT>                        dependency.setSystemPath( properties.getProperty( "dependency." + i + ".systemPath" ) );<a name="line.1005"></a>
<FONT color="green">1006</FONT>                        dependency.setType( properties.getProperty( "dependency." + i + ".type" ) );<a name="line.1006"></a>
<FONT color="green">1007</FONT>                        dependency.setVersion( properties.getProperty( "dependency." + i + ".version" ) );<a name="line.1007"></a>
<FONT color="green">1008</FONT>                        dependency.setOptional(<a name="line.1008"></a>
<FONT color="green">1009</FONT>                            Boolean.valueOf( properties.getProperty( "dependency." + i + ".optional" ) ) );<a name="line.1009"></a>
<FONT color="green">1010</FONT>                        versionMetadata.addDependency( dependency );<a name="line.1010"></a>
<FONT color="green">1011</FONT>                    }<a name="line.1011"></a>
<FONT color="green">1012</FONT>                    else<a name="line.1012"></a>
<FONT color="green">1013</FONT>                    {<a name="line.1013"></a>
<FONT color="green">1014</FONT>                        done = true;<a name="line.1014"></a>
<FONT color="green">1015</FONT>                    }<a name="line.1015"></a>
<FONT color="green">1016</FONT>                    i++;<a name="line.1016"></a>
<FONT color="green">1017</FONT>                }<a name="line.1017"></a>
<FONT color="green">1018</FONT>    <a name="line.1018"></a>
<FONT color="green">1019</FONT>                String facetIds = properties.getProperty( "facetIds", "" );<a name="line.1019"></a>
<FONT color="green">1020</FONT>                if ( facetIds.length() &gt; 0 )<a name="line.1020"></a>
<FONT color="green">1021</FONT>                {<a name="line.1021"></a>
<FONT color="green">1022</FONT>                    for ( String facetId : facetIds.split( "," ) )<a name="line.1022"></a>
<FONT color="green">1023</FONT>                    {<a name="line.1023"></a>
<FONT color="green">1024</FONT>                        MetadataFacetFactory factory = metadataFacetFactories.get( facetId );<a name="line.1024"></a>
<FONT color="green">1025</FONT>                        if ( factory == null )<a name="line.1025"></a>
<FONT color="green">1026</FONT>                        {<a name="line.1026"></a>
<FONT color="green">1027</FONT>                            log.error( "Attempted to load unknown project version metadata facet: {}", facetId );<a name="line.1027"></a>
<FONT color="green">1028</FONT>                        }<a name="line.1028"></a>
<FONT color="green">1029</FONT>                        else<a name="line.1029"></a>
<FONT color="green">1030</FONT>                        {<a name="line.1030"></a>
<FONT color="green">1031</FONT>                            MetadataFacet facet = factory.createMetadataFacet();<a name="line.1031"></a>
<FONT color="green">1032</FONT>                            Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();<a name="line.1032"></a>
<FONT color="green">1033</FONT>                            for ( Object key : new ArrayList( properties.keySet() ) )<a name="line.1033"></a>
<FONT color="green">1034</FONT>                            {<a name="line.1034"></a>
<FONT color="green">1035</FONT>                                String property = (String) key;<a name="line.1035"></a>
<FONT color="green">1036</FONT>                                if ( property.startsWith( facet.getFacetId() ) )<a name="line.1036"></a>
<FONT color="green">1037</FONT>                                {<a name="line.1037"></a>
<FONT color="green">1038</FONT>                                    map.put( property.substring( facet.getFacetId().length() + 1 ),<a name="line.1038"></a>
<FONT color="green">1039</FONT>                                             properties.getProperty( property ) );<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>                            facet.fromProperties( map );<a name="line.1042"></a>
<FONT color="green">1043</FONT>                            versionMetadata.addFacet( facet );<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>                }<a name="line.1046"></a>
<FONT color="green">1047</FONT>    <a name="line.1047"></a>
<FONT color="green">1048</FONT>                updateProjectVersionFacets( versionMetadata, properties );<a name="line.1048"></a>
<FONT color="green">1049</FONT>            }<a name="line.1049"></a>
<FONT color="green">1050</FONT>            return versionMetadata;<a name="line.1050"></a>
<FONT color="green">1051</FONT>        }<a name="line.1051"></a>
<FONT color="green">1052</FONT>    <a name="line.1052"></a>
<FONT color="green">1053</FONT>        public Collection&lt;String&gt; getArtifactVersions( String repoId, String namespace, String projectId,<a name="line.1053"></a>
<FONT color="green">1054</FONT>                                                       String projectVersion )<a name="line.1054"></a>
<FONT color="green">1055</FONT>        {<a name="line.1055"></a>
<FONT color="green">1056</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );<a name="line.1056"></a>
<FONT color="green">1057</FONT>    <a name="line.1057"></a>
<FONT color="green">1058</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.1058"></a>
<FONT color="green">1059</FONT>    <a name="line.1059"></a>
<FONT color="green">1060</FONT>            Set&lt;String&gt; versions = new HashSet&lt;String&gt;();<a name="line.1060"></a>
<FONT color="green">1061</FONT>            for ( Map.Entry entry : properties.entrySet() )<a name="line.1061"></a>
<FONT color="green">1062</FONT>            {<a name="line.1062"></a>
<FONT color="green">1063</FONT>                String name = (String) entry.getKey();<a name="line.1063"></a>
<FONT color="green">1064</FONT>                if ( name.startsWith( "artifact:version:" ) )<a name="line.1064"></a>
<FONT color="green">1065</FONT>                {<a name="line.1065"></a>
<FONT color="green">1066</FONT>                    versions.add( (String) entry.getValue() );<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>            return versions;<a name="line.1069"></a>
<FONT color="green">1070</FONT>        }<a name="line.1070"></a>
<FONT color="green">1071</FONT>    <a name="line.1071"></a>
<FONT color="green">1072</FONT>        public Collection&lt;ProjectVersionReference&gt; getProjectReferences( String repoId, String namespace, String projectId,<a name="line.1072"></a>
<FONT color="green">1073</FONT>                                                                         String projectVersion )<a name="line.1073"></a>
<FONT color="green">1074</FONT>        {<a name="line.1074"></a>
<FONT color="green">1075</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );<a name="line.1075"></a>
<FONT color="green">1076</FONT>    <a name="line.1076"></a>
<FONT color="green">1077</FONT>            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );<a name="line.1077"></a>
<FONT color="green">1078</FONT>            int numberOfRefs = Integer.parseInt( properties.getProperty( "ref:lastReferenceNum", "-1" ) ) + 1;<a name="line.1078"></a>
<FONT color="green">1079</FONT>    <a name="line.1079"></a>
<FONT color="green">1080</FONT>            List&lt;ProjectVersionReference&gt; references = new ArrayList&lt;ProjectVersionReference&gt;();<a name="line.1080"></a>
<FONT color="green">1081</FONT>            for ( int i = 0; i &lt; numberOfRefs; i++ )<a name="line.1081"></a>
<FONT color="green">1082</FONT>            {<a name="line.1082"></a>
<FONT color="green">1083</FONT>                ProjectVersionReference reference = new ProjectVersionReference();<a name="line.1083"></a>
<FONT color="green">1084</FONT>                reference.setProjectId( properties.getProperty( "ref:reference." + i + ".projectId" ) );<a name="line.1084"></a>
<FONT color="green">1085</FONT>                reference.setNamespace( properties.getProperty( "ref:reference." + i + ".namespace" ) );<a name="line.1085"></a>
<FONT color="green">1086</FONT>                reference.setProjectVersion( properties.getProperty( "ref:reference." + i + ".projectVersion" ) );<a name="line.1086"></a>
<FONT color="green">1087</FONT>                reference.setReferenceType( ProjectVersionReference.ReferenceType.valueOf(<a name="line.1087"></a>
<FONT color="green">1088</FONT>                    properties.getProperty( "ref:reference." + i + ".referenceType" ) ) );<a name="line.1088"></a>
<FONT color="green">1089</FONT>                references.add( reference );<a name="line.1089"></a>
<FONT color="green">1090</FONT>            }<a name="line.1090"></a>
<FONT color="green">1091</FONT>            return references;<a name="line.1091"></a>
<FONT color="green">1092</FONT>        }<a name="line.1092"></a>
<FONT color="green">1093</FONT>    <a name="line.1093"></a>
<FONT color="green">1094</FONT>        public Collection&lt;String&gt; getRootNamespaces( String repoId )<a name="line.1094"></a>
<FONT color="green">1095</FONT>        {<a name="line.1095"></a>
<FONT color="green">1096</FONT>            return getNamespaces( repoId, null );<a name="line.1096"></a>
<FONT color="green">1097</FONT>        }<a name="line.1097"></a>
<FONT color="green">1098</FONT>    <a name="line.1098"></a>
<FONT color="green">1099</FONT>        public Collection&lt;String&gt; getNamespaces( String repoId, String baseNamespace )<a name="line.1099"></a>
<FONT color="green">1100</FONT>        {<a name="line.1100"></a>
<FONT color="green">1101</FONT>            List&lt;String&gt; allNamespaces = new ArrayList&lt;String&gt;();<a name="line.1101"></a>
<FONT color="green">1102</FONT>            File directory = getDirectory( repoId );<a name="line.1102"></a>
<FONT color="green">1103</FONT>            File[] files = directory.listFiles();<a name="line.1103"></a>
<FONT color="green">1104</FONT>            if ( files != null )<a name="line.1104"></a>
<FONT color="green">1105</FONT>            {<a name="line.1105"></a>
<FONT color="green">1106</FONT>                for ( File namespace : files )<a name="line.1106"></a>
<FONT color="green">1107</FONT>                {<a name="line.1107"></a>
<FONT color="green">1108</FONT>                    if ( new File( namespace, NAMESPACE_METADATA_KEY + ".properties" ).exists() )<a name="line.1108"></a>
<FONT color="green">1109</FONT>                    {<a name="line.1109"></a>
<FONT color="green">1110</FONT>                        allNamespaces.add( namespace.getName() );<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>
<FONT color="green">1113</FONT>            }<a name="line.1113"></a>
<FONT color="green">1114</FONT>    <a name="line.1114"></a>
<FONT color="green">1115</FONT>            Set&lt;String&gt; namespaces = new LinkedHashSet&lt;String&gt;();<a name="line.1115"></a>
<FONT color="green">1116</FONT>            int fromIndex = baseNamespace != null ? baseNamespace.length() + 1 : 0;<a name="line.1116"></a>
<FONT color="green">1117</FONT>            for ( String namespace : allNamespaces )<a name="line.1117"></a>
<FONT color="green">1118</FONT>            {<a name="line.1118"></a>
<FONT color="green">1119</FONT>                if ( baseNamespace == null || namespace.startsWith( baseNamespace + "." ) )<a name="line.1119"></a>
<FONT color="green">1120</FONT>                {<a name="line.1120"></a>
<FONT color="green">1121</FONT>                    int i = namespace.indexOf( '.', fromIndex );<a name="line.1121"></a>
<FONT color="green">1122</FONT>                    if ( i &gt;= 0 )<a name="line.1122"></a>
<FONT color="green">1123</FONT>                    {<a name="line.1123"></a>
<FONT color="green">1124</FONT>                        namespaces.add( namespace.substring( fromIndex, i ) );<a name="line.1124"></a>
<FONT color="green">1125</FONT>                    }<a name="line.1125"></a>
<FONT color="green">1126</FONT>                    else<a name="line.1126"></a>
<FONT color="green">1127</FONT>                    {<a name="line.1127"></a>
<FONT color="green">1128</FONT>                        namespaces.add( namespace.substring( fromIndex ) );<a name="line.1128"></a>
<FONT color="green">1129</FONT>                    }<a name="line.1129"></a>
<FONT color="green">1130</FONT>                }<a name="line.1130"></a>
<FONT color="green">1131</FONT>            }<a name="line.1131"></a>
<FONT color="green">1132</FONT>            return new ArrayList&lt;String&gt;( namespaces );<a name="line.1132"></a>
<FONT color="green">1133</FONT>        }<a name="line.1133"></a>
<FONT color="green">1134</FONT>    <a name="line.1134"></a>
<FONT color="green">1135</FONT>        public Collection&lt;String&gt; getProjects( String repoId, String namespace )<a name="line.1135"></a>
<FONT color="green">1136</FONT>        {<a name="line.1136"></a>
<FONT color="green">1137</FONT>            List&lt;String&gt; projects = new ArrayList&lt;String&gt;();<a name="line.1137"></a>
<FONT color="green">1138</FONT>            File directory = new File( getDirectory( repoId ), namespace );<a name="line.1138"></a>
<FONT color="green">1139</FONT>            File[] files = directory.listFiles();<a name="line.1139"></a>
<FONT color="green">1140</FONT>            if ( files != null )<a name="line.1140"></a>
<FONT color="green">1141</FONT>            {<a name="line.1141"></a>
<FONT color="green">1142</FONT>                for ( File project : files )<a name="line.1142"></a>
<FONT color="green">1143</FONT>                {<a name="line.1143"></a>
<FONT color="green">1144</FONT>                    if ( new File( project, PROJECT_METADATA_KEY + ".properties" ).exists() )<a name="line.1144"></a>
<FONT color="green">1145</FONT>                    {<a name="line.1145"></a>
<FONT color="green">1146</FONT>                        projects.add( project.getName() );<a name="line.1146"></a>
<FONT color="green">1147</FONT>                    }<a name="line.1147"></a>
<FONT color="green">1148</FONT>                }<a name="line.1148"></a>
<FONT color="green">1149</FONT>            }<a name="line.1149"></a>
<FONT color="green">1150</FONT>            return projects;<a name="line.1150"></a>
<FONT color="green">1151</FONT>        }<a name="line.1151"></a>
<FONT color="green">1152</FONT>    <a name="line.1152"></a>
<FONT color="green">1153</FONT>        public Collection&lt;String&gt; getProjectVersions( String repoId, String namespace, String projectId )<a name="line.1153"></a>
<FONT color="green">1154</FONT>        {<a name="line.1154"></a>
<FONT color="green">1155</FONT>            List&lt;String&gt; projectVersions = new ArrayList&lt;String&gt;();<a name="line.1155"></a>
<FONT color="green">1156</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId );<a name="line.1156"></a>
<FONT color="green">1157</FONT>            File[] files = directory.listFiles();<a name="line.1157"></a>
<FONT color="green">1158</FONT>            if ( files != null )<a name="line.1158"></a>
<FONT color="green">1159</FONT>            {<a name="line.1159"></a>
<FONT color="green">1160</FONT>                for ( File projectVersion : files )<a name="line.1160"></a>
<FONT color="green">1161</FONT>                {<a name="line.1161"></a>
<FONT color="green">1162</FONT>                    if ( new File( projectVersion, PROJECT_VERSION_METADATA_KEY + ".properties" ).exists() )<a name="line.1162"></a>
<FONT color="green">1163</FONT>                    {<a name="line.1163"></a>
<FONT color="green">1164</FONT>                        projectVersions.add( projectVersion.getName() );<a name="line.1164"></a>
<FONT color="green">1165</FONT>                    }<a name="line.1165"></a>
<FONT color="green">1166</FONT>                }<a name="line.1166"></a>
<FONT color="green">1167</FONT>            }<a name="line.1167"></a>
<FONT color="green">1168</FONT>            return projectVersions;<a name="line.1168"></a>
<FONT color="green">1169</FONT>        }<a name="line.1169"></a>
<FONT color="green">1170</FONT>    <a name="line.1170"></a>
<FONT color="green">1171</FONT>        public void removeProject( String repositoryId, String namespace, String projectId )<a name="line.1171"></a>
<FONT color="green">1172</FONT>            throws MetadataRepositoryException<a name="line.1172"></a>
<FONT color="green">1173</FONT>        {<a name="line.1173"></a>
<FONT color="green">1174</FONT>            File directory = new File( getDirectory( repositoryId ), namespace + "/" + projectId );<a name="line.1174"></a>
<FONT color="green">1175</FONT>            try<a name="line.1175"></a>
<FONT color="green">1176</FONT>            {<a name="line.1176"></a>
<FONT color="green">1177</FONT>                if ( directory.exists() )<a name="line.1177"></a>
<FONT color="green">1178</FONT>                {<a name="line.1178"></a>
<FONT color="green">1179</FONT>                    FileUtils.deleteDirectory( directory );<a name="line.1179"></a>
<FONT color="green">1180</FONT>                }<a name="line.1180"></a>
<FONT color="green">1181</FONT>            }<a name="line.1181"></a>
<FONT color="green">1182</FONT>            catch ( IOException e )<a name="line.1182"></a>
<FONT color="green">1183</FONT>            {<a name="line.1183"></a>
<FONT color="green">1184</FONT>                throw new MetadataRepositoryException( e.getMessage(), e );<a name="line.1184"></a>
<FONT color="green">1185</FONT>            }<a name="line.1185"></a>
<FONT color="green">1186</FONT>        }<a name="line.1186"></a>
<FONT color="green">1187</FONT>    <a name="line.1187"></a>
<FONT color="green">1188</FONT>        public void removeProjectVersion( String repoId, String namespace, String projectId, String projectVersion )<a name="line.1188"></a>
<FONT color="green">1189</FONT>            throws MetadataRepositoryException<a name="line.1189"></a>
<FONT color="green">1190</FONT>        {<a name="line.1190"></a>
<FONT color="green">1191</FONT>            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );<a name="line.1191"></a>
<FONT color="green">1192</FONT>            if ( directory.exists() )<a name="line.1192"></a>
<FONT color="green">1193</FONT>            {<a name="line.1193"></a>
<FONT color="green">1194</FONT>                try<a name="line.1194"></a>
<FONT color="green">1195</FONT>                {<a name="line.1195"></a>
<FONT color="green">1196</FONT>                    FileUtils.deleteDirectory( directory );<a name="line.1196"></a>
<FONT color="green">1197</FONT>                }<a name="line.1197"></a>
<FONT color="green">1198</FONT>                catch ( IOException e )<a name="line.1198"></a>
<FONT color="green">1199</FONT>                {<a name="line.1199"></a>
<FONT color="green">1200</FONT>                    throw new MetadataRepositoryException( e.getMessage(), e );<a name="line.1200"></a>
<FONT color="green">1201</FONT>                }<a name="line.1201"></a>
<FONT color="green">1202</FONT>            }<a name="line.1202"></a>
<FONT color="green">1203</FONT>        }<a name="line.1203"></a>
<FONT color="green">1204</FONT>    <a name="line.1204"></a>
<FONT color="green">1205</FONT>        private void writeProperties( Properties properties, File directory, String propertiesKey )<a name="line.1205"></a>
<FONT color="green">1206</FONT>            throws IOException<a name="line.1206"></a>
<FONT color="green">1207</FONT>        {<a name="line.1207"></a>
<FONT color="green">1208</FONT>            directory.mkdirs();<a name="line.1208"></a>
<FONT color="green">1209</FONT>            FileOutputStream os = new FileOutputStream( new File( directory, propertiesKey + ".properties" ) );<a name="line.1209"></a>
<FONT color="green">1210</FONT>            try<a name="line.1210"></a>
<FONT color="green">1211</FONT>            {<a name="line.1211"></a>
<FONT color="green">1212</FONT>                properties.store( os, null );<a name="line.1212"></a>
<FONT color="green">1213</FONT>            }<a name="line.1213"></a>
<FONT color="green">1214</FONT>            finally<a name="line.1214"></a>
<FONT color="green">1215</FONT>            {<a name="line.1215"></a>
<FONT color="green">1216</FONT>                IOUtils.closeQuietly( os );<a name="line.1216"></a>
<FONT color="green">1217</FONT>            }<a name="line.1217"></a>
<FONT color="green">1218</FONT>        }<a name="line.1218"></a>
<FONT color="green">1219</FONT>    <a name="line.1219"></a>
<FONT color="green">1220</FONT>        private static class ArtifactComparator<a name="line.1220"></a>
<FONT color="green">1221</FONT>            implements Comparator&lt;ArtifactMetadata&gt;<a name="line.1221"></a>
<FONT color="green">1222</FONT>        {<a name="line.1222"></a>
<FONT color="green">1223</FONT>            public int compare( ArtifactMetadata artifact1, ArtifactMetadata artifact2 )<a name="line.1223"></a>
<FONT color="green">1224</FONT>            {<a name="line.1224"></a>
<FONT color="green">1225</FONT>                if ( artifact1.getWhenGathered() == artifact2.getWhenGathered() )<a name="line.1225"></a>
<FONT color="green">1226</FONT>                {<a name="line.1226"></a>
<FONT color="green">1227</FONT>                    return 0;<a name="line.1227"></a>
<FONT color="green">1228</FONT>                }<a name="line.1228"></a>
<FONT color="green">1229</FONT>                if ( artifact1.getWhenGathered() == null )<a name="line.1229"></a>
<FONT color="green">1230</FONT>                {<a name="line.1230"></a>
<FONT color="green">1231</FONT>                    return 1;<a name="line.1231"></a>
<FONT color="green">1232</FONT>                }<a name="line.1232"></a>
<FONT color="green">1233</FONT>                if ( artifact2.getWhenGathered() == null )<a name="line.1233"></a>
<FONT color="green">1234</FONT>                {<a name="line.1234"></a>
<FONT color="green">1235</FONT>                    return -1;<a name="line.1235"></a>
<FONT color="green">1236</FONT>                }<a name="line.1236"></a>
<FONT color="green">1237</FONT>                return artifact1.getWhenGathered().compareTo( artifact2.getWhenGathered() );<a name="line.1237"></a>
<FONT color="green">1238</FONT>            }<a name="line.1238"></a>
<FONT color="green">1239</FONT>        }<a name="line.1239"></a>
<FONT color="green">1240</FONT>    <a name="line.1240"></a>
<FONT color="green">1241</FONT>        public List&lt;ArtifactMetadata&gt; getArtifacts( String repoId )<a name="line.1241"></a>
<FONT color="green">1242</FONT>        {<a name="line.1242"></a>
<FONT color="green">1243</FONT>            List&lt;ArtifactMetadata&gt; artifacts = new ArrayList&lt;ArtifactMetadata&gt;();<a name="line.1243"></a>
<FONT color="green">1244</FONT>            for ( String ns : getRootNamespaces( repoId ) )<a name="line.1244"></a>
<FONT color="green">1245</FONT>            {<a name="line.1245"></a>
<FONT color="green">1246</FONT>                getArtifacts( artifacts, repoId, ns );<a name="line.1246"></a>
<FONT color="green">1247</FONT>            }<a name="line.1247"></a>
<FONT color="green">1248</FONT>            return artifacts;<a name="line.1248"></a>
<FONT color="green">1249</FONT>        }<a name="line.1249"></a>
<FONT color="green">1250</FONT>    <a name="line.1250"></a>
<FONT color="green">1251</FONT>        private void getArtifacts( List&lt;ArtifactMetadata&gt; artifacts, String repoId, String ns )<a name="line.1251"></a>
<FONT color="green">1252</FONT>        {<a name="line.1252"></a>
<FONT color="green">1253</FONT>            for ( String namespace : getNamespaces( repoId, ns ) )<a name="line.1253"></a>
<FONT color="green">1254</FONT>            {<a name="line.1254"></a>
<FONT color="green">1255</FONT>                getArtifacts( artifacts, repoId, ns + "." + namespace );<a name="line.1255"></a>
<FONT color="green">1256</FONT>            }<a name="line.1256"></a>
<FONT color="green">1257</FONT>    <a name="line.1257"></a>
<FONT color="green">1258</FONT>            for ( String project : getProjects( repoId, ns ) )<a name="line.1258"></a>
<FONT color="green">1259</FONT>            {<a name="line.1259"></a>
<FONT color="green">1260</FONT>                for ( String version : getProjectVersions( repoId, ns, project ) )<a name="line.1260"></a>
<FONT color="green">1261</FONT>                {<a name="line.1261"></a>
<FONT color="green">1262</FONT>                    for ( ArtifactMetadata artifact : getArtifacts( repoId, ns, project, version ) )<a name="line.1262"></a>
<FONT color="green">1263</FONT>                    {<a name="line.1263"></a>
<FONT color="green">1264</FONT>                        artifacts.add( artifact );<a name="line.1264"></a>
<FONT color="green">1265</FONT>                    }<a name="line.1265"></a>
<FONT color="green">1266</FONT>                }<a name="line.1266"></a>
<FONT color="green">1267</FONT>            }<a name="line.1267"></a>
<FONT color="green">1268</FONT>        }<a name="line.1268"></a>
<FONT color="green">1269</FONT>    }<a name="line.1269"></a>




























































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