]> source.dussan.org Git - archiva.git/blob
4e73d58b59733cb82db32ff8502d8dcd379aba6d
[archiva.git] /
1 package org.apache.maven.archiva.reporting;
2
3 /*
4  * Copyright 2005-2006 The Apache Software Foundation.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 import org.apache.maven.archiva.discoverer.ArtifactDiscoverer;
20 import org.apache.maven.archiva.discoverer.DiscovererException;
21 import org.apache.maven.archiva.discoverer.MetadataDiscoverer;
22 import org.apache.maven.archiva.discoverer.filter.AcceptAllMetadataFilter;
23 import org.apache.maven.artifact.Artifact;
24 import org.apache.maven.artifact.factory.ArtifactFactory;
25 import org.apache.maven.artifact.repository.ArtifactRepository;
26 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
27 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
28 import org.apache.maven.artifact.repository.layout.LegacyRepositoryLayout;
29 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
30 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
31 import org.apache.maven.model.Model;
32 import org.apache.maven.project.MavenProject;
33 import org.apache.maven.project.MavenProjectBuilder;
34 import org.apache.maven.project.ProjectBuildingException;
35 import org.codehaus.plexus.logging.AbstractLogEnabled;
36
37 import java.io.File;
38 import java.util.Collections;
39 import java.util.Iterator;
40 import java.util.List;
41 import java.util.Map;
42
43 /**
44  * Report executor implementation.
45  *
46  * @plexus.component
47  */
48 public class DefaultReportExecutor
49     extends AbstractLogEnabled
50     implements ReportExecutor
51 {
52     /**
53      * @plexus.requirement
54      */
55     private MavenProjectBuilder projectBuilder;
56
57     /**
58      * @plexus.requirement
59      */
60     private ReportingStore reportingStore;
61
62     /**
63      * @plexus.requirement
64      */
65     private ArtifactFactory artifactFactory;
66
67     /**
68      * @todo replace with a ReportGroup that is identified as "health" and has requirements on the specific health reports
69      * @plexus.requirement role="org.apache.maven.archiva.reporting.ArtifactReportProcessor"
70      */
71     private List artifactReports;
72
73     /**
74      * @plexus.requirement role="org.apache.maven.archiva.reporting.MetadataReportProcessor"
75      */
76     private List metadataReports;
77
78     /**
79      * @plexus.requirement role="org.apache.maven.archiva.discoverer.ArtifactDiscoverer"
80      */
81     private Map artifactDiscoverers;
82
83     /**
84      * @plexus.requirement role="org.apache.maven.archiva.discoverer.MetadataDiscoverer"
85      */
86     private Map metadataDiscoverers;
87
88     public void runMetadataReports( List metadata, ArtifactRepository repository )
89         throws ReportingStoreException
90     {
91         ReportingDatabase reporter = getReportDatabase( repository );
92
93         for ( Iterator i = metadata.iterator(); i.hasNext(); )
94         {
95             RepositoryMetadata repositoryMetadata = (RepositoryMetadata) i.next();
96
97             File file =
98                 new File( repository.getBasedir(), repository.pathOfRemoteRepositoryMetadata( repositoryMetadata ) );
99             reporter.cleanMetadata( repositoryMetadata, file.lastModified() );
100
101             // TODO: should the report set be limitable by configuration?
102             runMetadataReports( repositoryMetadata, repository, reporter );
103         }
104
105         reportingStore.storeReports( reporter, repository );
106     }
107
108     private void runMetadataReports( RepositoryMetadata repositoryMetadata, ArtifactRepository repository,
109                                      ReportingDatabase reporter )
110     {
111         for ( Iterator i = metadataReports.iterator(); i.hasNext(); )
112         {
113             MetadataReportProcessor report = (MetadataReportProcessor) i.next();
114
115             report.processMetadata( repositoryMetadata, repository, reporter );
116         }
117     }
118
119     public void runArtifactReports( List artifacts, ArtifactRepository repository )
120         throws ReportingStoreException
121     {
122         ReportingDatabase reporter = getReportDatabase( repository );
123
124         for ( Iterator i = artifacts.iterator(); i.hasNext(); )
125         {
126             Artifact artifact = (Artifact) i.next();
127
128             Model model = null;
129             try
130             {
131                 Artifact pomArtifact = artifactFactory.createProjectArtifact( artifact.getGroupId(),
132                                                                               artifact.getArtifactId(),
133                                                                               artifact.getVersion() );
134                 MavenProject project =
135                     projectBuilder.buildFromRepository( pomArtifact, Collections.EMPTY_LIST, repository );
136
137                 model = project.getModel();
138             }
139             catch ( ProjectBuildingException e )
140             {
141                 reporter.addWarning( artifact, "Error reading project model: " + e );
142             }
143
144             reporter.removeArtifact( artifact );
145
146             runArtifactReports( artifact, model, reporter );
147         }
148
149         reportingStore.storeReports( reporter, repository );
150     }
151
152     public ReportingDatabase getReportDatabase( ArtifactRepository repository )
153         throws ReportingStoreException
154     {
155         getLogger().debug( "Reading previous report database from repository " + repository.getId() );
156         return reportingStore.getReportsFromStore( repository );
157     }
158
159     public void runReports( ArtifactRepository repository, List blacklistedPatterns, ArtifactFilter filter )
160         throws DiscovererException, ReportingStoreException
161     {
162         // Flush (as in toilet, not store) the report database
163         reportingStore.removeReportDatabase( repository );
164
165         // Discovery process
166         String layoutProperty = getRepositoryLayout( repository.getLayout() );
167         ArtifactDiscoverer discoverer = (ArtifactDiscoverer) artifactDiscoverers.get( layoutProperty );
168
169         // Save some memory by not tracking paths we won't use
170         // TODO: Plexus CDC should be able to inject this configuration
171         discoverer.setTrackOmittedPaths( false );
172
173         List artifacts = discoverer.discoverArtifacts( repository, blacklistedPatterns, filter );
174
175         if ( !artifacts.isEmpty() )
176         {
177             getLogger().info( "Discovered " + artifacts.size() + " artifacts" );
178
179             // run the reports
180             runArtifactReports( artifacts, repository );
181         }
182
183         MetadataDiscoverer metadataDiscoverer = (MetadataDiscoverer) metadataDiscoverers.get( layoutProperty );
184         List metadata =
185             metadataDiscoverer.discoverMetadata( repository, blacklistedPatterns, new AcceptAllMetadataFilter() );
186
187         if ( !metadata.isEmpty() )
188         {
189             getLogger().info( "Discovered " + metadata.size() + " metadata files" );
190
191             // run the reports
192             runMetadataReports( metadata, repository );
193         }
194     }
195
196     private String getRepositoryLayout( ArtifactRepositoryLayout layout )
197     {
198         // gross limitation that there is no reverse lookup of the hint for the layout.
199         if ( layout.getClass().equals( DefaultRepositoryLayout.class ) )
200         {
201             return "default";
202         }
203         else if ( layout.getClass().equals( LegacyRepositoryLayout.class ) )
204         {
205             return "legacy";
206         }
207         else
208         {
209             throw new IllegalArgumentException( "Unknown layout: " + layout );
210         }
211     }
212
213     private void runArtifactReports( Artifact artifact, Model model, ReportingDatabase reporter )
214     {
215         // TODO: should the report set be limitable by configuration?
216         for ( Iterator i = artifactReports.iterator(); i.hasNext(); )
217         {
218             ArtifactReportProcessor report = (ArtifactReportProcessor) i.next();
219
220             report.processArtifact( artifact, model, reporter );
221         }
222     }
223 }