Coverage Report - org.apache.maven.report.projectinfo.DependenciesReport
 
Classes in this File Line Coverage Branch Coverage Complexity
DependenciesReport
78%
31/40
50%
6/12
2.8
 
 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  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  
      * 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  1
         if ( settings.isOffline() && dependencyLocationsEnabled )
 184  
         {
 185  0
             getLog().warn( "The parameter 'dependencyLocationsEnabled' is ignored in offline mode." );
 186  0
             dependencyLocationsEnabled = false;
 187  
         }
 188  
 
 189  
         try
 190  
         {
 191  1
             copyResources( new File( getOutputDirectory() ) );
 192  
         }
 193  0
         catch ( IOException e )
 194  
         {
 195  0
             getLog().error( "Cannot copy ressources", e );
 196  1
         }
 197  
 
 198  1
         RepositoryUtils repoUtils =
 199  
             new RepositoryUtils( getLog(), wagonManager, settings,
 200  
                                  mavenProjectBuilder, factory, resolver, project.getRemoteArtifactRepositories(),
 201  
                                  project.getPluginArtifactRepositories(), localRepository,
 202  
                                  repositoryMetadataManager );
 203  
 
 204  1
         DependencyNode dependencyTreeNode = resolveProject();
 205  
 
 206  1
         Dependencies dependencies = new Dependencies( project, dependencyTreeNode, classesAnalyzer );
 207  
 
 208  1
         DependenciesReportConfiguration config =
 209  
             new DependenciesReportConfiguration( dependencyDetailsEnabled, dependencyLocationsEnabled );
 210  
 
 211  1
         DependenciesRenderer r =
 212  
             new DependenciesRenderer( getSink(), locale, i18n, getLog(), settings, dependencies,
 213  
                                       dependencyTreeNode, config, repoUtils, artifactFactory, mavenProjectBuilder,
 214  
                                       remoteRepositories, localRepository );
 215  1
         r.render();
 216  1
     }
 217  
 
 218  
     /** {@inheritDoc} */
 219  
     public String getOutputName()
 220  
     {
 221  2
         return "dependencies";
 222  
     }
 223  
 
 224  
     protected String getI18Nsection()
 225  
     {
 226  1
         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  1
             ArtifactFilter artifactFilter = new ScopeArtifactFilter( Artifact.SCOPE_TEST );
 241  1
             return dependencyTreeBuilder.buildDependencyTree( project, localRepository, factory,
 242  
                                                               artifactMetadataSource, artifactFilter, collector );
 243  
         }
 244  0
         catch ( DependencyTreeBuilderException e )
 245  
         {
 246  0
             getLog().error( "Unable to build dependency tree.", e );
 247  0
             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  1
         InputStream resourceList =
 259  
             getClass().getClassLoader().getResourceAsStream( RESOURCES_DIR + "/resources.txt" );
 260  
 
 261  1
         if ( resourceList != null )
 262  
         {
 263  1
             LineNumberReader reader =
 264  
                 new LineNumberReader( new InputStreamReader( resourceList, ReaderFactory.US_ASCII ) );
 265  
 
 266  1
             String line = reader.readLine();
 267  
 
 268  2
             while ( line != null )
 269  
             {
 270  1
                 InputStream is = getClass().getClassLoader().getResourceAsStream( RESOURCES_DIR + "/" + line );
 271  
 
 272  1
                 if ( is == null )
 273  
                 {
 274  0
                     throw new IOException( "The resource " + line + " doesn't exist." );
 275  
                 }
 276  
 
 277  1
                 File outputFile = new File( outputDirectory, line );
 278  
 
 279  1
                 if ( !outputFile.getParentFile().exists() )
 280  
                 {
 281  0
                     outputFile.getParentFile().mkdirs();
 282  
                 }
 283  
 
 284  1
                 FileOutputStream w = new FileOutputStream( outputFile );
 285  
 
 286  1
                 IOUtil.copy( is, w );
 287  
 
 288  1
                 IOUtil.close( is );
 289  
 
 290  1
                 IOUtil.close( w );
 291  
 
 292  1
                 line = reader.readLine();
 293  1
             }
 294  
         }
 295  1
     }
 296  
 }