Coverage Report - org.apache.maven.report.projectinfo.DependenciesReport
 
Classes in this File Line Coverage Branch Coverage Complexity
DependenciesReport
81 %
38/47
50 %
6/12
0
 
 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  1
 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  1
         if ( settings.isOffline() && dependencyLocationsEnabled )
 164  
         {
 165  0
             getLog().warn( "The parameter 'dependencyLocationsEnabled' is ignored in offline mode." );
 166  0
             dependencyLocationsEnabled = false;
 167  
         }
 168  
 
 169  
         try
 170  
         {
 171  1
             copyResources( new File( getOutputDirectory() ) );
 172  
         }
 173  0
         catch ( IOException e )
 174  
         {
 175  0
             getLog().error( "Cannot copy ressources", e );
 176  1
         }
 177  
 
 178  
         @SuppressWarnings( "unchecked" )
 179  1
         RepositoryUtils repoUtils =
 180  
             new RepositoryUtils( getLog(), wagonManager, settings,
 181  
                                  mavenProjectBuilder, factory, resolver, project.getRemoteArtifactRepositories(),
 182  
                                  project.getPluginArtifactRepositories(), localRepository,
 183  
                                  repositoryMetadataManager );
 184  
 
 185  1
         DependencyNode dependencyTreeNode = resolveProject();
 186  
 
 187  1
         Dependencies dependencies = new Dependencies( project, dependencyTreeNode, classesAnalyzer );
 188  
 
 189  1
         DependenciesReportConfiguration config =
 190  
             new DependenciesReportConfiguration( dependencyDetailsEnabled, dependencyLocationsEnabled );
 191  
 
 192  1
         DependenciesRenderer r =
 193  
             new DependenciesRenderer( getSink(), locale, getI18N( locale ), getLog(), settings, dependencies,
 194  
                                       dependencyTreeNode, config, repoUtils, artifactFactory, mavenProjectBuilder,
 195  
                                       remoteRepositories, localRepository );
 196  1
         r.render();
 197  1
     }
 198  
 
 199  
     /** {@inheritDoc} */
 200  
     public String getOutputName()
 201  
     {
 202  2
         return "dependencies";
 203  
     }
 204  
 
 205  
     @Override
 206  
     protected String getI18Nsection()
 207  
     {
 208  1
         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  1
             ArtifactFilter artifactFilter = new ScopeArtifactFilter( Artifact.SCOPE_TEST );
 223  1
             return dependencyTreeBuilder.buildDependencyTree( project, localRepository, factory,
 224  
                                                               artifactMetadataSource, artifactFilter, collector );
 225  
         }
 226  0
         catch ( DependencyTreeBuilderException e )
 227  
         {
 228  0
             getLog().error( "Unable to build dependency tree.", e );
 229  0
             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  1
         InputStream resourceList = null;
 241  1
         LineNumberReader reader = null;
 242  
         try
 243  
         {
 244  1
             resourceList = getClass().getClassLoader().getResourceAsStream( RESOURCES_DIR + "/resources.txt" );
 245  
 
 246  1
             if ( resourceList != null )
 247  
             {
 248  1
                 reader = new LineNumberReader( new InputStreamReader( resourceList, ReaderFactory.US_ASCII ) );
 249  
 
 250  1
                 String line = reader.readLine();
 251  
 
 252  2
                 while ( line != null )
 253  
                 {
 254  1
                     InputStream is = getClass().getClassLoader().getResourceAsStream( RESOURCES_DIR + "/" + line );
 255  
 
 256  1
                     if ( is == null )
 257  
                     {
 258  0
                         throw new IOException( "The resource " + line + " doesn't exist." );
 259  
                     }
 260  
 
 261  1
                     File outputFile = new File( outputDirectory, line );
 262  
 
 263  1
                     if ( !outputFile.getParentFile().exists() )
 264  
                     {
 265  0
                         outputFile.getParentFile().mkdirs();
 266  
                     }
 267  
 
 268  1
                     FileOutputStream w = null;
 269  
                     try
 270  
                     {
 271  1
                         w = new FileOutputStream( outputFile );
 272  1
                         IOUtil.copy( is, w );
 273  
                     }
 274  
                     finally
 275  
                     {
 276  1
                         IOUtil.close( is );
 277  
 
 278  1
                         IOUtil.close( w );
 279  1
                     }
 280  
 
 281  1
                     line = reader.readLine();
 282  1
                 }
 283  
             }
 284  
         }
 285  
         finally
 286  
         {
 287  1
             IOUtil.close( resourceList );
 288  1
             IOUtil.close( reader );
 289  1
         }
 290  1
     }
 291  
 }