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