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.ArtifactRepository;
36  import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
37  import org.apache.maven.artifact.resolver.ArtifactCollector;
38  import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
39  import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
40  import org.apache.maven.project.MavenProjectBuilder;
41  import org.apache.maven.report.projectinfo.dependencies.Dependencies;
42  import org.apache.maven.report.projectinfo.dependencies.DependenciesReportConfiguration;
43  import org.apache.maven.report.projectinfo.dependencies.RepositoryUtils;
44  import org.apache.maven.report.projectinfo.dependencies.renderer.DependenciesRenderer;
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 1100828 2011-05-08 22:34:59Z 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      * Display file details for each dependency, such as: file size, number of
139      * classes, number of packages etc.
140      *
141      * @since 2.1
142      * @parameter expression="${dependency.details.enabled}" default-value="true"
143      */
144     private boolean dependencyDetailsEnabled;
145 
146     /**
147      * Display the repository locations of the dependencies. If Maven is configured to be offline, this parameter
148      * will be ignored.
149      *
150      * @since 2.1
151      * @parameter expression="${dependency.locations.enabled}" default-value="true"
152      */
153     private boolean dependencyLocationsEnabled;
154 
155 
156     // ----------------------------------------------------------------------
157     // Public methods
158     // ----------------------------------------------------------------------
159 
160     @Override
161     public void executeReport( Locale locale )
162     {
163         if ( settings.isOffline() && dependencyLocationsEnabled )
164         {
165             getLog().warn( "The parameter 'dependencyLocationsEnabled' is ignored in offline mode." );
166             dependencyLocationsEnabled = false;
167         }
168 
169         try
170         {
171             copyResources( new File( getOutputDirectory() ) );
172         }
173         catch ( IOException e )
174         {
175             getLog().error( "Cannot copy ressources", e );
176         }
177 
178         @SuppressWarnings( "unchecked" )
179         RepositoryUtils repoUtils =
180             new RepositoryUtils( getLog(), wagonManager, settings,
181                                  mavenProjectBuilder, factory, resolver, project.getRemoteArtifactRepositories(),
182                                  project.getPluginArtifactRepositories(), localRepository,
183                                  repositoryMetadataManager );
184 
185         DependencyNode dependencyTreeNode = resolveProject();
186 
187         Dependencies dependencies = new Dependencies( project, dependencyTreeNode, classesAnalyzer );
188 
189         DependenciesReportConfiguration config =
190             new DependenciesReportConfiguration( dependencyDetailsEnabled, dependencyLocationsEnabled );
191 
192         DependenciesRenderer r =
193             new DependenciesRenderer( getSink(), locale, getI18N( locale ), getLog(), settings, dependencies,
194                                       dependencyTreeNode, config, repoUtils, artifactFactory, mavenProjectBuilder,
195                                       remoteRepositories, localRepository );
196         r.render();
197     }
198 
199     /** {@inheritDoc} */
200     public String getOutputName()
201     {
202         return "dependencies";
203     }
204 
205     @Override
206     protected String getI18Nsection()
207     {
208         return "dependencies";
209     }
210 
211     // ----------------------------------------------------------------------
212     // Private methods
213     // ----------------------------------------------------------------------
214 
215     /**
216      * @return resolve the dependency tree
217      */
218     private DependencyNode resolveProject()
219     {
220         try
221         {
222             ArtifactFilter artifactFilter = new ScopeArtifactFilter( Artifact.SCOPE_TEST );
223             return dependencyTreeBuilder.buildDependencyTree( project, localRepository, factory,
224                                                               artifactMetadataSource, artifactFilter, collector );
225         }
226         catch ( DependencyTreeBuilderException e )
227         {
228             getLog().error( "Unable to build dependency tree.", e );
229             return null;
230         }
231     }
232 
233     /**
234      * @param outputDirectory the wanted output directory
235      * @throws IOException if any
236      */
237     private void copyResources( File outputDirectory )
238         throws IOException
239     {
240         InputStream resourceList = null;
241         LineNumberReader reader = null;
242         try
243         {
244             resourceList = getClass().getClassLoader().getResourceAsStream( RESOURCES_DIR + "/resources.txt" );
245 
246             if ( resourceList != null )
247             {
248                 reader = new LineNumberReader( new InputStreamReader( resourceList, ReaderFactory.US_ASCII ) );
249 
250                 String line = reader.readLine();
251 
252                 while ( line != null )
253                 {
254                     InputStream is = getClass().getClassLoader().getResourceAsStream( RESOURCES_DIR + "/" + line );
255 
256                     if ( is == null )
257                     {
258                         throw new IOException( "The resource " + line + " doesn't exist." );
259                     }
260 
261                     File outputFile = new File( outputDirectory, line );
262 
263                     if ( !outputFile.getParentFile().exists() )
264                     {
265                         outputFile.getParentFile().mkdirs();
266                     }
267 
268                     FileOutputStream w = null;
269                     try
270                     {
271                         w = new FileOutputStream( outputFile );
272                         IOUtil.copy( is, w );
273                     }
274                     finally
275                     {
276                         IOUtil.close( is );
277 
278                         IOUtil.close( w );
279                     }
280 
281                     line = reader.readLine();
282                 }
283             }
284         }
285         finally
286         {
287             IOUtil.close( resourceList );
288             IOUtil.close( reader );
289         }
290     }
291 }