]> source.dussan.org Git - archiva.git/blob
6ab5726623f95f673faa334abe47976e2c2f6878
[archiva.git] /
1 package org.apache.archiva.consumers.metadata;
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 org.apache.archiva.metadata.model.ArtifactMetadata;
23 import org.apache.archiva.metadata.model.ProjectMetadata;
24 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
25 import org.apache.archiva.metadata.repository.MetadataRepository;
26 import org.apache.archiva.metadata.repository.MetadataRepositoryException;
27 import org.apache.archiva.metadata.repository.RepositorySession;
28 import org.apache.archiva.metadata.repository.RepositorySessionFactory;
29 import org.apache.archiva.metadata.repository.storage.RepositoryStorage;
30 import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException;
31 import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException;
32 import org.apache.maven.archiva.common.utils.VersionUtil;
33 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
34 import org.apache.maven.archiva.configuration.ConfigurationNames;
35 import org.apache.maven.archiva.configuration.FileTypes;
36 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
37 import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
38 import org.apache.maven.archiva.consumers.ConsumerException;
39 import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
40 import org.codehaus.plexus.registry.Registry;
41 import org.codehaus.plexus.registry.RegistryListener;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import org.springframework.context.annotation.Scope;
45 import org.springframework.stereotype.Service;
46
47 import javax.annotation.PostConstruct;
48 import javax.inject.Inject;
49 import javax.inject.Named;
50 import java.util.ArrayList;
51 import java.util.Date;
52 import java.util.List;
53
54 /**
55  * Take an artifact off of disk and put it into the metadata repository.
56  *
57  * @version $Id: ArtifactUpdateDatabaseConsumer.java 718864 2008-11-19 06:33:35Z brett $
58  */
59 @Service("knownRepositoryContentConsumer#create-archiva-metadata")
60 @Scope("prototype")
61 public class ArchivaMetadataCreationConsumer
62     extends AbstractMonitoredConsumer
63     implements KnownRepositoryContentConsumer, RegistryListener
64 {
65     /**
66      * plexus.configuration default-value="create-archiva-metadata"
67      */
68     private String id = "create-archiva-metadata";
69
70     /**
71      * plexus.configuration default-value="Create basic metadata for Archiva to be able to reference the artifact"
72      */
73     private String description = "Create basic metadata for Archiva to be able to reference the artifact";
74
75     /**
76      * plexus.requirement
77      */
78     @Inject
79     private ArchivaConfiguration configuration;
80
81     /**
82      * plexus.requirement
83      */
84     @Inject
85     private FileTypes filetypes;
86
87     private Date whenGathered;
88
89     private List<String> includes = new ArrayList<String>();
90
91     /**
92      * FIXME: can be of other types
93      *
94      * @plexus.requirement
95      */
96     @Inject
97     private RepositorySessionFactory repositorySessionFactory;
98
99     /**
100      * FIXME: this needs to be configurable based on storage type - and could also be instantiated per repo. Change to a
101      * factory.
102      *
103      * plexus.requirement role-hint="maven2"
104      */
105     @Inject
106     @Named(value = "repositoryStorage#maven2")
107     private RepositoryStorage repositoryStorage;
108
109     private static final Logger log = LoggerFactory.getLogger( ArchivaMetadataCreationConsumer.class );
110
111     private String repoId;
112
113     public String getId()
114     {
115         return this.id;
116     }
117
118     public String getDescription()
119     {
120         return this.description;
121     }
122
123     public boolean isPermanent()
124     {
125         return true;
126     }
127
128     public List<String> getExcludes()
129     {
130         return getDefaultArtifactExclusions();
131     }
132
133     public List<String> getIncludes()
134     {
135         return this.includes;
136     }
137
138     public void beginScan( ManagedRepositoryConfiguration repo, Date whenGathered )
139         throws ConsumerException
140     {
141         repoId = repo.getId();
142         this.whenGathered = whenGathered;
143     }
144
145     public void beginScan( ManagedRepositoryConfiguration repository, Date whenGathered, boolean executeOnEntireRepo )
146         throws ConsumerException
147     {
148         beginScan( repository, whenGathered );
149     }
150
151     public void processFile( String path )
152         throws ConsumerException
153     {
154         // note that we do minimal processing including checksums and POM information for performance of
155         // the initial scan. Any request for this information will be intercepted and populated on-demand
156         // or picked up by subsequent scans
157
158         ArtifactMetadata artifact = repositoryStorage.readArtifactMetadataFromPath( repoId, path );
159
160         ProjectMetadata project = new ProjectMetadata();
161         project.setNamespace( artifact.getNamespace() );
162         project.setId( artifact.getProject() );
163
164         String projectVersion = VersionUtil.getBaseVersion( artifact.getVersion() );
165
166         RepositorySession repositorySession = repositorySessionFactory.createSession();
167         try
168         {
169             MetadataRepository metadataRepository = repositorySession.getRepository();
170
171             boolean createVersionMetadata = false;
172
173             // FIXME: maybe not too efficient since it may have already been read and stored for this artifact
174             ProjectVersionMetadata versionMetadata = null;
175             try
176             {
177                 versionMetadata = repositoryStorage.readProjectVersionMetadata( repoId, artifact.getNamespace(),
178                                                                                 artifact.getProject(), projectVersion );
179                 createVersionMetadata = true;
180             }
181             catch ( RepositoryStorageMetadataNotFoundException e )
182             {
183                 log.warn( "Missing or invalid POM for artifact: " + path + "; creating empty metadata" );
184
185                 versionMetadata = new ProjectVersionMetadata();
186                 versionMetadata.setId( projectVersion );
187                 versionMetadata.setIncomplete( true );
188                 createVersionMetadata = true;
189             }
190             catch ( RepositoryStorageMetadataInvalidException e )
191             {
192                 log.warn( "Error occurred resolving POM for artifact: " + path + "; message: " + e.getMessage() );
193             }
194
195             // read the metadata and update it if it is newer or doesn't exist
196             artifact.setWhenGathered( whenGathered );
197             metadataRepository.updateArtifact( repoId, project.getNamespace(), project.getId(), projectVersion,
198                                                artifact );
199             if ( createVersionMetadata )
200             {
201                 metadataRepository.updateProjectVersion( repoId, project.getNamespace(), project.getId(),
202                                                          versionMetadata );
203             }
204             metadataRepository.updateProject( repoId, project );
205             repositorySession.save();
206         }
207         catch ( MetadataRepositoryException e )
208         {
209             log.warn( "Error occurred persisting metadata for artifact: " + path + "; message: " + e.getMessage(), e );
210             repositorySession.revert();
211         }
212         finally
213         {
214             repositorySession.close();
215         }
216     }
217
218     public void processFile( String path, boolean executeOnEntireRepo )
219         throws ConsumerException
220     {
221         processFile( path );
222     }
223
224     public void completeScan()
225     {
226         /* do nothing */
227     }
228
229     public void completeScan( boolean executeOnEntireRepo )
230     {
231         completeScan();
232     }
233
234     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
235     {
236         if ( ConfigurationNames.isRepositoryScanning( propertyName ) )
237         {
238             initIncludes();
239         }
240     }
241
242     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
243     {
244         /* do nothing */
245     }
246
247     private void initIncludes()
248     {
249         includes.clear();
250
251         includes.addAll( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) );
252     }
253
254     @PostConstruct
255     public void initialize()
256     {
257         configuration.addChangeListener( this );
258
259         initIncludes();
260     }
261 }