View Javadoc

1   package org.apache.maven.report.projectinfo;
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.FileOutputStream;
24  import java.io.IOException;
25  import java.io.InputStream;
26  import java.io.InputStreamReader;
27  import java.io.LineNumberReader;
28  import java.util.List;
29  import java.util.Locale;
30  
31  import org.apache.maven.artifact.Artifact;
32  import org.apache.maven.artifact.factory.ArtifactFactory;
33  import org.apache.maven.artifact.manager.WagonManager;
34  import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
35  import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
36  import org.apache.maven.artifact.resolver.ArtifactCollector;
37  import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
38  import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
39  import org.apache.maven.project.MavenProjectBuilder;
40  import org.apache.maven.report.projectinfo.dependencies.Dependencies;
41  import org.apache.maven.report.projectinfo.dependencies.DependenciesReportConfiguration;
42  import org.apache.maven.report.projectinfo.dependencies.RepositoryUtils;
43  import org.apache.maven.report.projectinfo.dependencies.renderer.DependenciesRenderer;
44  import org.apache.maven.settings.Settings;
45  import org.apache.maven.shared.dependency.tree.DependencyNode;
46  import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
47  import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
48  import org.apache.maven.shared.jar.classes.JarClassesAnalysis;
49  import org.codehaus.plexus.util.IOUtil;
50  import org.codehaus.plexus.util.ReaderFactory;
51  
52  /**
53   * Generates the Project Dependencies report.
54   *
55   * @author <a href="mailto:jason@maven.org">Jason van Zyl </a>
56   * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton </a>
57   * @version $Id: DependenciesReport.java 940323 2010-05-02 22:07:05Z hboutemy $
58   * @since 2.0
59   * @goal dependencies
60   * @requiresDependencyResolution test
61   */
62  public class DependenciesReport
63      extends AbstractProjectInfoReport
64  {
65      /** Images resources dir */
66      private static final String RESOURCES_DIR = "org/apache/maven/report/projectinfo/resources";
67  
68      // ----------------------------------------------------------------------
69      // Mojo components
70      // ----------------------------------------------------------------------
71  
72      /**
73       * Maven Project Builder component.
74       *
75       * @component
76       */
77      private MavenProjectBuilder mavenProjectBuilder;
78  
79      /**
80       * Artifact metadata source component.
81       *
82       * @component
83       */
84      protected ArtifactMetadataSource artifactMetadataSource;
85  
86      /**
87       * Artifact collector component.
88       *
89       * @component
90       */
91      private ArtifactCollector collector;
92  
93      /**
94       * Wagon manager component.
95       *
96       * @since 2.1
97       * @component
98       */
99      private WagonManager wagonManager;
100 
101     /**
102      * Dependency tree builder component.
103      *
104      * @since 2.1
105      * @component
106      */
107     private DependencyTreeBuilder dependencyTreeBuilder;
108 
109     /**
110      * Jar classes analyzer component.
111      *
112      * @since 2.1
113      * @component
114      */
115     private JarClassesAnalysis classesAnalyzer;
116 
117     /**
118      * Repository metadata component.
119      *
120      * @since 2.1
121      * @component
122      */
123     private RepositoryMetadataManager repositoryMetadataManager;
124 
125     /**
126      * Maven Artifact Factory component.
127      *
128      * @component
129      * @since 2.1
130      */
131     private ArtifactFactory artifactFactory;
132 
133     // ----------------------------------------------------------------------
134     // Mojo parameters
135     // ----------------------------------------------------------------------
136 
137     /**
138      * The current user system settings for use in Maven.
139      *
140      * @since 2.1
141      * @parameter expression="${settings}"
142      * @required
143      * @readonly
144      */
145     private Settings settings;
146 
147     /**
148      * Remote repositories used for the project.
149      *
150      * @since 2.1
151      * @parameter expression="${project.remoteArtifactRepositories}"
152      * @required
153      * @readonly
154      */
155     private List remoteRepositories;
156 
157     /**
158      * Display file details for each dependency, such as: file size, number of
159      * classes, number of packages etc.
160      *
161      * @since 2.1
162      * @parameter expression="${dependency.details.enabled}" default-value="true"
163      */
164     private boolean dependencyDetailsEnabled;
165 
166     /**
167      * Display the repository locations of the dependencies. If Maven is configured to be offline, this parameter
168      * will be ignored.
169      *
170      * @since 2.1
171      * @parameter expression="${dependency.locations.enabled}" default-value="true"
172      */
173     private boolean dependencyLocationsEnabled;
174 
175 
176     // ----------------------------------------------------------------------
177     // Public methods
178     // ----------------------------------------------------------------------
179 
180     /** {@inheritDoc} */
181     public void executeReport( Locale locale )
182     {
183         if ( settings.isOffline() && dependencyLocationsEnabled )
184         {
185             getLog().warn( "The parameter 'dependencyLocationsEnabled' is ignored in offline mode." );
186             dependencyLocationsEnabled = false;
187         }
188 
189         try
190         {
191             copyResources( new File( getOutputDirectory() ) );
192         }
193         catch ( IOException e )
194         {
195             getLog().error( "Cannot copy ressources", e );
196         }
197 
198         RepositoryUtils repoUtils =
199             new RepositoryUtils( getLog(), wagonManager, settings,
200                                  mavenProjectBuilder, factory, resolver, project.getRemoteArtifactRepositories(),
201                                  project.getPluginArtifactRepositories(), localRepository,
202                                  repositoryMetadataManager );
203 
204         DependencyNode dependencyTreeNode = resolveProject();
205 
206         Dependencies dependencies = new Dependencies( project, dependencyTreeNode, classesAnalyzer );
207 
208         DependenciesReportConfiguration config =
209             new DependenciesReportConfiguration( dependencyDetailsEnabled, dependencyLocationsEnabled );
210 
211         DependenciesRenderer r =
212             new DependenciesRenderer( getSink(), locale, i18n, getLog(), settings, dependencies,
213                                       dependencyTreeNode, config, repoUtils, artifactFactory, mavenProjectBuilder,
214                                       remoteRepositories, localRepository );
215         r.render();
216     }
217 
218     /** {@inheritDoc} */
219     public String getOutputName()
220     {
221         return "dependencies";
222     }
223 
224     protected String getI18Nsection()
225     {
226         return "dependencies";
227     }
228 
229     // ----------------------------------------------------------------------
230     // Private methods
231     // ----------------------------------------------------------------------
232 
233     /**
234      * @return resolve the dependency tree
235      */
236     private DependencyNode resolveProject()
237     {
238         try
239         {
240             ArtifactFilter artifactFilter = new ScopeArtifactFilter( Artifact.SCOPE_TEST );
241             return dependencyTreeBuilder.buildDependencyTree( project, localRepository, factory,
242                                                               artifactMetadataSource, artifactFilter, collector );
243         }
244         catch ( DependencyTreeBuilderException e )
245         {
246             getLog().error( "Unable to build dependency tree.", e );
247             return null;
248         }
249     }
250 
251     /**
252      * @param outputDirectory the wanted output directory
253      * @throws IOException if any
254      */
255     private void copyResources( File outputDirectory )
256         throws IOException
257     {
258         InputStream resourceList =
259             getClass().getClassLoader().getResourceAsStream( RESOURCES_DIR + "/resources.txt" );
260 
261         if ( resourceList != null )
262         {
263             LineNumberReader reader =
264                 new LineNumberReader( new InputStreamReader( resourceList, ReaderFactory.US_ASCII ) );
265 
266             String line = reader.readLine();
267 
268             while ( line != null )
269             {
270                 InputStream is = getClass().getClassLoader().getResourceAsStream( RESOURCES_DIR + "/" + line );
271 
272                 if ( is == null )
273                 {
274                     throw new IOException( "The resource " + line + " doesn't exist." );
275                 }
276 
277                 File outputFile = new File( outputDirectory, line );
278 
279                 if ( !outputFile.getParentFile().exists() )
280                 {
281                     outputFile.getParentFile().mkdirs();
282                 }
283 
284                 FileOutputStream w = new FileOutputStream( outputFile );
285 
286                 IOUtil.copy( is, w );
287 
288                 IOUtil.close( is );
289 
290                 IOUtil.close( w );
291 
292                 line = reader.readLine();
293             }
294         }
295     }
296 }