]> source.dussan.org Git - archiva.git/blob
c98974104a93110920cab71f472390e97066d92d
[archiva.git] /
1 package org.apache.archiva.metadata.repository.file;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *   http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import java.io.File;
23 import java.io.FileInputStream;
24 import java.io.FileNotFoundException;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.Collection;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.Properties;
32
33 import org.apache.archiva.metadata.model.ArtifactMetadata;
34 import org.apache.archiva.metadata.model.ProjectMetadata;
35 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
36 import org.apache.archiva.metadata.repository.MetadataRepository;
37 import org.apache.commons.io.IOUtils;
38
39 /**
40  * @plexus.component role="org.apache.archiva.metadata.repository.MetadataRepository"
41  */
42 public class FileMetadataRepository
43     implements MetadataRepository
44 {
45     /**
46      * TODO: this isn't suitable for production use
47      *
48      * @plexus.configuration
49      */
50     private File directory = new File( System.getProperty( "user.home" ), ".archiva-metadata" );
51
52     public void updateProject( String repoId, ProjectMetadata project )
53     {
54         // TODO: this is a more braindead implementation than we would normally expect, for prototyping purposes
55         try
56         {
57             File projectDirectory =
58                 new File( this.directory, repoId + "/" + project.getNamespace() + "/" + project.getId() );
59             Properties properties = new Properties();
60             properties.setProperty( "namespace", project.getNamespace() );
61             properties.setProperty( "id", project.getId() );
62             writeProperties( properties, projectDirectory );
63         }
64         catch ( IOException e )
65         {
66             // TODO!
67             e.printStackTrace();
68         }
69     }
70
71     public void updateProjectVersion( String repoId, String namespace, String projectId,
72                                       ProjectVersionMetadata versionMetadata )
73     {
74         File directory = new File( this.directory, repoId + "/" + namespace + "/" + projectId );
75
76         Properties properties = new Properties();
77         properties.setProperty( "id", versionMetadata.getId() );
78
79         try
80         {
81             writeProperties( properties, new File( directory, versionMetadata.getId() ) );
82         }
83         catch ( IOException e )
84         {
85             // TODO
86             e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
87         }
88     }
89
90     public void updateArtifact( String repoId, String namespace, String projectId, String projectVersion,
91                                 ArtifactMetadata artifact )
92     {
93         File directory = new File( this.directory, repoId + "/" + namespace + "/" + projectId + "/" + projectVersion );
94
95         Properties properties = readProperties( directory );
96
97         properties.setProperty( "updated:" + artifact.getId(), Long.toString( artifact.getUpdated().getTime() ) );
98         properties.setProperty( "size:" + artifact.getId(), Long.toString( artifact.getSize() ) );
99         properties.setProperty( "version:" + artifact.getId(), artifact.getVersion() );
100
101         try
102         {
103             writeProperties( properties, directory );
104         }
105         catch ( IOException e )
106         {
107             // TODO
108             e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
109         }
110     }
111
112     private Properties readProperties( File directory )
113     {
114         Properties properties = new Properties();
115         FileInputStream in = null;
116         try
117         {
118             in = new FileInputStream( new File( directory, "metadata.xml" ) );
119             properties.loadFromXML( in );
120         }
121         catch ( FileNotFoundException e )
122         {
123             // skip - use blank properties
124         }
125         catch ( IOException e )
126         {
127             // TODO
128             e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
129         }
130         finally
131         {
132             IOUtils.closeQuietly( in );
133         }
134         return properties;
135     }
136
137     public ProjectMetadata getProject( String repoId, String namespace, String projectId )
138     {
139         File directory = new File( this.directory, repoId + "/" + namespace + "/" + projectId );
140
141         Properties properties = readProperties( directory );
142
143         ProjectMetadata project = new ProjectMetadata();
144         project.setNamespace( properties.getProperty( "namespace" ) );
145         project.setId( properties.getProperty( "id" ) );
146         return project;
147     }
148
149     public ProjectVersionMetadata getProjectVersion( String repoId, String namespace, String projectId,
150                                                      String projectVersion )
151     {
152         File directory = new File( this.directory, repoId + "/" + namespace + "/" + projectId + "/" + projectVersion );
153
154         Properties properties = readProperties( directory );
155         String id = properties.getProperty( "id" );
156         ProjectVersionMetadata versionMetadata = null;
157         if ( id != null )
158         {
159             versionMetadata = new ProjectVersionMetadata();
160             versionMetadata.setId( id );
161         }
162         return versionMetadata;
163     }
164
165     public Collection<String> getArtifactVersions( String repoId, String namespace, String projectId,
166                                                    String projectVersion )
167     {
168         File directory = new File( this.directory, repoId + "/" + namespace + "/" + projectId + "/" + projectVersion );
169
170         Properties properties = readProperties( directory );
171
172         List<String> versions = new ArrayList<String>();
173         for ( Map.Entry entry : properties.entrySet() )
174         {
175             String name = (String) entry.getKey();
176             if ( name.startsWith( "version:" ) )
177             {
178                 versions.add( (String) entry.getValue() );
179             }
180         }
181         return versions;
182     }
183
184     private void writeProperties( Properties properties, File directory )
185         throws IOException
186     {
187         directory.mkdirs();
188         FileOutputStream os = new FileOutputStream( new File( directory, "metadata.xml" ) );
189         try
190         {
191             properties.storeToXML( os, null );
192         }
193         finally
194         {
195             IOUtils.closeQuietly( os );
196         }
197     }
198
199 }