]> source.dussan.org Git - archiva.git/blob
0e4eb70c69b4334223a3f9ae38f52724e0a997a7
[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.load( 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 groupId, String projectId )
138     {
139         File directory = new File( this.directory, repoId + "/" + 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 groupId, String projectId,
150                                                      String projectVersion )
151     {
152         File directory = new File( this.directory, repoId + "/" + projectId + "/" + projectVersion );
153
154         Properties properties = readProperties( directory );
155
156         ProjectVersionMetadata versionMetadata = new ProjectVersionMetadata();
157         versionMetadata.setId( properties.getProperty( "id" ) );
158         return versionMetadata;
159     }
160
161     public Collection<String> getArtifactVersions( String repoId, String namespace, String projectId,
162                                                    String projectVersion )
163     {
164         File directory = new File( this.directory, repoId + "/" + projectId + "/" + projectVersion );
165
166         Properties properties = readProperties( directory );
167
168         List<String> versions = new ArrayList<String>();
169         for ( Map.Entry entry : properties.entrySet() )
170         {
171             String name = (String) entry.getKey();
172             if ( name.startsWith( "version:" ) )
173             {
174                 versions.add( (String) entry.getValue() );
175             }
176         }
177         return versions;
178     }
179
180     private void writeProperties( Properties properties, File directory )
181         throws IOException
182     {
183         directory.mkdirs();
184         FileOutputStream os = new FileOutputStream( new File( directory, "metadata.xml" ) );
185         try
186         {
187             properties.storeToXML( os, null );
188         }
189         finally
190         {
191             IOUtils.closeQuietly( os );
192         }
193     }
194
195 }