You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ca...@apache.org on 2006/08/14 22:13:46 UTC

svn commit: r431427 - in /maven/plugins/trunk/maven-project-info-reports-plugin: pom.xml src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java src/main/resources/project-info-report.properties

Author: carlos
Date: Mon Aug 14 13:13:45 2006
New Revision: 431427

URL: http://svn.apache.org/viewvc?rev=431427&view=rev
Log:
[MPIR-55] Detailed Artifact Information & Repository Location for each Dependency.
Submitted by: Joakim Erdfelt

Modified:
    maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml?rev=431427&r1=431426&r2=431427&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml Mon Aug 14 13:13:45 2006
@@ -108,6 +108,31 @@
       <version>2.0.4</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-shared-jar</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-provider-api</artifactId>
+      <version>1.0-beta-2-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-ssh</artifactId>
+      <version>1.0-beta-2-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-file</artifactId>
+      <version>1.0-beta-2-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-http-lightweight</artifactId>
+      <version>1.0-beta-2-SNAPSHOT</version>
+    </dependency>
+    <dependency>
       <groupId>org.apache.maven.scm</groupId>
       <artifactId>maven-scm-provider-clearcase</artifactId>
       <version>1.0-beta-3</version>

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java?rev=431427&r1=431426&r2=431427&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java Mon Aug 14 13:13:45 2006
@@ -16,9 +16,23 @@
  * limitations under the License.
  */
 
+import java.io.File;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.artifact.manager.WagonManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
 import org.apache.maven.artifact.resolver.ArtifactCollector;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
@@ -29,16 +43,29 @@
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.report.projectinfo.ReportResolutionListener.Node;
 import org.apache.maven.reporting.AbstractMavenReportRenderer;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import org.apache.maven.settings.Proxy;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.shared.jar.Jar;
+import org.apache.maven.shared.jar.JarException;
+import org.apache.maven.shared.jar.classes.JarClasses;
+import org.apache.maven.wagon.ConnectionException;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.UnsupportedProtocolException;
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.authentication.AuthenticationException;
+import org.apache.maven.wagon.authentication.AuthenticationInfo;
+import org.apache.maven.wagon.authorization.AuthorizationException;
+import org.apache.maven.wagon.observers.Debug;
+import org.apache.maven.wagon.proxy.ProxyInfo;
+import org.apache.maven.wagon.repository.Repository;
+import org.codehaus.plexus.PlexusConstants;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 
 /**
  * Generates the Project Dependencies report.
@@ -51,6 +78,7 @@
  */
 public class DependenciesReport
     extends AbstractProjectInfoReport
+    implements Contextualizable
 {
     /**
      * Maven Project Builder.
@@ -68,6 +96,32 @@
      * @component
      */
     private ArtifactCollector collector;
+    
+    /**
+     * @component
+     */
+    private WagonManager wagonManager;
+
+    /**
+     * The current user system settings for use in Maven.
+     *
+     * @parameter expression="${settings}"
+     * @required
+     * @readonly
+     */
+    private Settings settings;
+    
+    /**
+     * @parameter expression="${dependency.details.enabled}" default-value="true"
+     */
+    private boolean dependencyDetailsEnabled;
+    
+    /**
+     * @parameter expression="${dependency.locations.enabled}" default-value="false"
+     */
+    private boolean dependencyLocationsEnabled;
+    
+    private PlexusContainer container;
 
     /**
      * @see org.apache.maven.reporting.MavenReport#getName(java.util.Locale)
@@ -166,6 +220,107 @@
         return "dependencies";
     }
 
+    public void contextualize( Context context )
+        throws ContextException
+    {
+        container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
+    }
+
+    private class Dependencies
+    {
+        private List projectDependencies;
+
+        private ReportResolutionListener resolvedDependencies;
+
+        public Dependencies( MavenProject project, ReportResolutionListener listener )
+        {
+            /* Workaround to ensure proper File objects in the 
+             * Artifacts from the ReportResolutionListener
+             */
+            Map projectMap = new HashMap();
+            Iterator it = project.getArtifacts().iterator();
+            while(it.hasNext())
+            {
+                Artifact artifact = (Artifact) it.next();
+                projectMap.put( ArtifactUtils.versionlessKey( artifact ), artifact );
+            }
+            
+            mapArtifactFiles(listener.getRootNode(), projectMap);
+            
+            this.projectDependencies = listener.getRootNode().getChildren();
+            this.resolvedDependencies = listener;
+        }
+
+        private void mapArtifactFiles( Node node, Map projectMap )
+        {
+            List childs = node.getChildren();
+            if( (childs == null) || childs.isEmpty() ) {
+                return;
+            }
+            
+            Iterator it = childs.iterator();
+            while(it.hasNext())
+            {
+                Node anode = (ReportResolutionListener.Node) it.next();
+                String key = ArtifactUtils.versionlessKey( anode.getArtifact() );
+                Artifact projartifact = (Artifact) projectMap.get( key );
+                if( projartifact != null ) {
+                    anode.getArtifact().setFile(  projartifact.getFile() );
+                }
+                
+                mapArtifactFiles(anode, projectMap);
+            }
+        }
+
+        public boolean hasDependencies()
+        {
+            return ( projectDependencies != null ) && ( !this.projectDependencies.isEmpty() );
+        }
+
+        public List getProjectDependencies()
+        {
+            return new ArrayList( projectDependencies );
+        }
+
+        public List getTransitiveDependencies()
+        {
+            List deps = new ArrayList( resolvedDependencies.getArtifacts() );
+            deps.removeAll( projectDependencies );
+            return deps;
+        }
+
+        public List getAllDependencies()
+        {
+            List deps = new ArrayList();
+
+            for ( Iterator it = resolvedDependencies.getArtifacts().iterator(); it.hasNext(); )
+            {
+                ReportResolutionListener.Node node = (ReportResolutionListener.Node) it.next();
+                Artifact artifact = node.getArtifact();
+                deps.add( artifact );
+            }
+            return deps;
+        }
+
+        public Map getDependenciesByScope()
+        {
+            Map dependenciesByScope = new HashMap();
+            for ( Iterator i = getAllDependencies().iterator(); i.hasNext(); )
+            {
+                Artifact artifact = (Artifact) i.next();
+
+                List multiValue = (List) dependenciesByScope.get( artifact.getScope() );
+                if ( multiValue == null )
+                {
+                    multiValue = new ArrayList();
+                }
+                multiValue.add( artifact );
+                dependenciesByScope.put( artifact.getScope(), multiValue );
+            }
+            return dependenciesByScope;
+        }
+    }
+
     private class DependenciesRenderer
         extends AbstractMavenReportRenderer
     {
@@ -190,9 +345,9 @@
         public void renderBody()
         {
             // Dependencies report
-            List dependencies = listener.getRootNode().getChildren();
+            Dependencies deps = new Dependencies( project, listener );
 
-            if ( dependencies.isEmpty() )
+            if ( !deps.hasDependencies() )
             {
                 startSection( getTitle() );
 
@@ -204,35 +359,71 @@
                 return;
             }
 
-            startSection( getTitle() );
+            // === Section: Project Dependencies.
+            renderSectionProjectDependencies( deps );
+
+            // === Section: Project Transitive Dependencies.
+            renderSectionProjectTransitiveDependencies( deps );
 
+            // === Section: Project Dependency Graph.
+            renderSectionProjectDependencyGraph();
+
+            if ( dependencyDetailsEnabled )
+            {
+                // === Section: Dependency File Details.
+                renderSectionDependencyFileDetails( deps );
+            }
+
+            if ( !settings.isOffline() && dependencyLocationsEnabled )
+            {
+                // === Section: Dependency Repository Locations.
+                renderSectionDependencyRepositoryLocations( deps );
+            }
+        }
+
+        private String[] getDependencyTableHeader()
+        {
             String groupId = getReportString( "report.dependencies.column.groupId" );
             String artifactId = getReportString( "report.dependencies.column.artifactId" );
             String version = getReportString( "report.dependencies.column.version" );
             String classifier = getReportString( "report.dependencies.column.classifier" );
             String type = getReportString( "report.dependencies.column.type" );
             String optional = getReportString( "report.dependencies.column.optional" );
-            String[] tableHeader = new String[]{groupId, artifactId, version, classifier, type, optional};
+            String[] tableHeader = new String[] { groupId, artifactId, version, classifier, type, optional };
+            return tableHeader;
+        }
+
+        private void renderSectionProjectDependencies( Dependencies dependencies )
+        {
+            String[] tableHeader = getDependencyTableHeader();
+
+            startSection( getTitle() );
 
             // collect dependencies by scope
-            Map dependenciesByScope = getDependenciesByScope( dependencies );
+            Map dependenciesByScope = dependencies.getDependenciesByScope();
+
+            renderDependenciesForAllScopes( tableHeader, dependenciesByScope );
 
+            endSection();
+        }
+
+        private void renderDependenciesForAllScopes( String[] tableHeader, Map dependenciesByScope )
+        {
             renderDependenciesForScope( Artifact.SCOPE_COMPILE,
                                         (List) dependenciesByScope.get( Artifact.SCOPE_COMPILE ), tableHeader );
             renderDependenciesForScope( Artifact.SCOPE_RUNTIME,
                                         (List) dependenciesByScope.get( Artifact.SCOPE_RUNTIME ), tableHeader );
-            renderDependenciesForScope( Artifact.SCOPE_TEST, (List) dependenciesByScope.get( Artifact.SCOPE_TEST ),
-                                        tableHeader );
-            renderDependenciesForScope( Artifact.SCOPE_PROVIDED,
+            renderDependenciesForScope( Artifact.SCOPE_TEST, 
+                                        (List) dependenciesByScope.get( Artifact.SCOPE_TEST ), tableHeader );
+            renderDependenciesForScope( Artifact.SCOPE_PROVIDED, 
                                         (List) dependenciesByScope.get( Artifact.SCOPE_PROVIDED ), tableHeader );
-            renderDependenciesForScope( Artifact.SCOPE_SYSTEM, (List) dependenciesByScope.get( Artifact.SCOPE_SYSTEM ),
-                                        tableHeader );
-
-            endSection();
+            renderDependenciesForScope( Artifact.SCOPE_SYSTEM, 
+                                        (List) dependenciesByScope.get( Artifact.SCOPE_SYSTEM ), tableHeader );
+        }
 
-            // Transitive dependencies
-            List artifacts = new ArrayList( listener.getArtifacts() );
-            artifacts.removeAll( dependencies );
+        private void renderSectionProjectTransitiveDependencies( Dependencies dependencies )
+        {
+            List artifacts = dependencies.getTransitiveDependencies();
 
             startSection( getReportString( "report.transitivedependencies.title" ) );
 
@@ -242,27 +433,32 @@
             }
             else
             {
-                paragraph( getReportString( "report.transitivedependencies.intro" ) );
+                String[] tableHeader = getDependencyTableHeader();
+                Map dependenciesByScope = dependencies.getDependenciesByScope();
 
-                dependenciesByScope = getDependenciesByScope( artifacts );
+                paragraph( getReportString( "report.transitivedependencies.intro" ) );
 
-                renderDependenciesForScope( Artifact.SCOPE_COMPILE,
-                                            (List) dependenciesByScope.get( Artifact.SCOPE_COMPILE ), tableHeader );
-                renderDependenciesForScope( Artifact.SCOPE_RUNTIME,
-                                            (List) dependenciesByScope.get( Artifact.SCOPE_RUNTIME ), tableHeader );
-                renderDependenciesForScope( Artifact.SCOPE_TEST, (List) dependenciesByScope.get( Artifact.SCOPE_TEST ),
-                                            tableHeader );
-                renderDependenciesForScope( Artifact.SCOPE_PROVIDED,
-                                            (List) dependenciesByScope.get( Artifact.SCOPE_PROVIDED ), tableHeader );
-                renderDependenciesForScope( Artifact.SCOPE_SYSTEM,
-                                            (List) dependenciesByScope.get( Artifact.SCOPE_SYSTEM ), tableHeader );
+                renderDependenciesForAllScopes( tableHeader, dependenciesByScope );
             }
 
             endSection();
+        }
 
-            //for Dependencies Graph
+        private void renderSectionProjectDependencyGraph()
+        {
             startSection( getReportString( "report.dependencies.graph.title" ) );
 
+            // === Section: Dependency Tree
+            renderSectionDependencyTree();
+            
+            // === Section: Dependency Listings
+            renderSectionDependencyListing();
+            
+            endSection();
+        }
+
+        private void renderSectionDependencyTree()
+        {
             //for Dependencies Graph Tree
             startSection( getReportString( "report.dependencies.graph.tree.title" ) );
             sink.paragraph();
@@ -271,32 +467,406 @@
             sink.list_();
             sink.paragraph_();
             endSection();
+        }
 
-            //for Artifact Descriptions / URLs
-            startSection( getReportString( "report.dependencies.graph.tables.title" ) );
-            printDescriptionsAndURLs( listener.getRootNode() );
-            endSection();
+        private void renderSectionDependencyFileDetails( Dependencies dependencies )
+        {
+            startSection( getReportString( "report.dependencies.file.details.title" ) );
+
+            List alldeps = dependencies.getAllDependencies();
+            Collections.sort( alldeps, getArtifactComparator() );
+
+            startTable();
+            String filename = getReportString( "report.dependencies.file.details.column.file" );
+            String size = getReportString( "report.dependencies.file.details.column.size" );
+            String entries = getReportString( "report.dependencies.file.details.column.entries" );
+            String classes = getReportString( "report.dependencies.file.details.column.classes" );
+            String packages = getReportString( "report.dependencies.file.details.column.packages" );
+            String jdkrev = getReportString( "report.dependencies.file.details.column.jdkrev" );
+            String debug = getReportString( "report.dependencies.file.details.column.debug" );
+            String sealed = getReportString( "report.dependencies.file.details.column.sealed" );
+
+            String[] tableHeader = new String[] { filename, size, entries, classes, packages, jdkrev, debug, sealed };
+            tableHeader( tableHeader );
+            
+            int totaldeps = 0;
+            long totaldepsize = 0;
+            int totalentries = 0;
+            int totalclasses = 0;
+            int totalpackages = 0;
+            double highestjdk = 0.0;
+            int totaldebug = 0;
+            int totalsealed = 0;
+            
+            DecimalFormat decFormat = new DecimalFormat("#,##0");
+
+            for ( Iterator it = alldeps.iterator(); it.hasNext(); )
+            {
+                Artifact artifact = (Artifact) it.next();
+                
+                if ( !Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
+                {
+                    if ( artifact.getFile() == null )
+                    {
+                        getLog().error( "Artifact: " + artifact.getId() + " has no file." );
+                        continue;
+                    }
+
+                    File artifactFile = artifact.getFile();
+
+                    totaldeps++;
+                    totaldepsize += artifactFile.length();
+
+                    if ( "jar".equalsIgnoreCase( artifact.getType() ) || "war".equalsIgnoreCase( artifact.getType() )
+                        || "ear".equalsIgnoreCase( artifact.getType() ) || "sar".equalsIgnoreCase( artifact.getType() )
+                        || "rar".equalsIgnoreCase( artifact.getType() ) || "par".equalsIgnoreCase( artifact.getType() )
+                        || "ejb".equalsIgnoreCase( artifact.getType() ) )
+                    {
+                        try
+                        {
+                            Jar jar = (Jar) container.lookup( Jar.ROLE );
+                            jar.setFile( artifactFile );
+                            JarClasses jclasses = jar.getClasses();
+
+                            String debugstr = "release";
+                            if ( jclasses.isDebugPresent() )
+                            {
+                                debugstr = "debug";
+                                totaldebug++;
+                            }
+
+                            String sealedstr = "";
+                            if ( jar.isSealed() )
+                            {
+                                sealedstr = "sealed";
+                                totalsealed++;
+                            }
+
+                            totalentries += jar.getEntries().size();
+                            totalclasses += jclasses.getClassNames().size();
+                            totalpackages += jclasses.getPackages().size();
+
+                            try
+                            {
+                                highestjdk = Math.max( highestjdk, Double.parseDouble( jclasses.getJdkRevision() ) );
+                            }
+                            catch ( NumberFormatException e )
+                            {
+                                // ignore
+                            }
+
+                            tableRow( new String[] {
+                                artifactFile.getName(),
+                                decFormat.format( artifactFile.length() ),
+                                decFormat.format( jar.getEntries().size() ),
+                                decFormat.format( jclasses.getClassNames().size() ),
+                                decFormat.format( jclasses.getPackages().size() ),
+                                jclasses.getJdkRevision(),
+                                debugstr,
+                                sealedstr } );
+                        }
+                        catch ( JarException e )
+                        {
+                            tableRow( new String[] {
+                                artifact.getId(),
+                                artifactFile.getAbsolutePath(),
+                                e.getMessage(),
+                                "",
+                                "",
+                                "",
+                                "",
+                                "" } );
+                        }
+                        catch ( ComponentLookupException e )
+                        {
+                            tableRow( new String[] {
+                                artifact.getId(),
+                                artifactFile.getAbsolutePath(),
+                                e.getMessage(),
+                                "",
+                                "",
+                                "",
+                                "",
+                                "" } );
+                        }
+                    }
+                    else
+                    {
+                        tableRow( new String[] {
+                            artifactFile.getName(),
+                            decFormat.format( artifactFile.length() ),
+                            "",
+                            "",
+                            "",
+                            "",
+                            "",
+                            "" } );
+                    }
+                }
+            }
+            
+            tableRow( new String[] {
+                "" + totaldeps + " total dependencies",
+                decFormat.format( totaldepsize ),
+                decFormat.format( totalentries ),
+                decFormat.format( totalclasses ),
+                decFormat.format( totalpackages ),
+                String.valueOf( highestjdk ),
+                decFormat.format( totaldebug ),
+                decFormat.format( totalsealed ) } );
 
+            endTable();
             endSection();
         }
+        
+        private void populateRepositoryMap( Map repos, List rawRepos )
+        {
+            Iterator it = rawRepos.iterator();
+            while(it.hasNext())
+            {
+                ArtifactRepository repo = (ArtifactRepository) it.next();
+                repos.put( repo.getId(), repo );
+            }
+        }
+        
+        private void renderSectionDependencyRepositoryLocations( Dependencies dependencies )
+        {
+            startSection( getReportString( "report.dependencies.repo.locations.title" ) );
+            
+            // Collect Alphabetical Dependencies
+            List alldeps = dependencies.getAllDependencies();
+            Collections.sort( alldeps, getArtifactComparator() );
+            
+            // Collect Repositories
+            Map repoMap = new HashMap();
+            
+            populateRepositoryMap( repoMap, project.getRemoteArtifactRepositories() );
+            
+            for ( Iterator it = alldeps.iterator(); it.hasNext(); )
+            {
+                Artifact artifact = (Artifact) it.next();
+                try
+                {
+                    MavenProject artifactProject = getMavenProjectFromRepository( artifact, localRepository );
+                    
+                    populateRepositoryMap( repoMap, artifactProject.getRemoteArtifactRepositories() );
+                }
+                catch ( ProjectBuildingException e )
+                {
+                    getLog().warn( "Unable to create maven project from repository.", e );
+                }
+            }
+            
+            // Render Repository List
+            
+            startTable();
+            String repoid = getReportString( "report.dependencies.repo.locations.column.repoid" );
+            String url = getReportString( "report.dependencies.repo.locations.column.url" );
+            String release = getReportString( "report.dependencies.repo.locations.column.release" );
+            String snapshot = getReportString( "report.dependencies.repo.locations.column.snapshot" );
+
+            String[] tableHeader = new String[] { repoid, url, release, snapshot };
+            tableHeader( tableHeader );
+            
+            String releaseEnabled = getReportString( "report.dependencies.repo.locations.cell.release.enabled" );
+            String releaseDisabled = getReportString( "report.dependencies.repo.locations.cell.release.disabled" );
+            
+            String snapshotEnabled = getReportString( "report.dependencies.repo.locations.cell.snapshot.enabled" );
+            String snapshotDisabled = getReportString( "report.dependencies.repo.locations.cell.snapshot.disabled" );
+            
+            for ( Iterator it = repoMap.keySet().iterator(); it.hasNext(); )
+            {
+                String key = (String) it.next();
+                ArtifactRepository repo = (ArtifactRepository) repoMap.get( key );
+
+                sink.tableRow();
+                tableCell( repo.getId() );
 
-        private Map getDependenciesByScope( List dependencies )
+                sink.tableCell();
+                sink.link( repo.getUrl() );
+                sink.text( repo.getUrl() );
+                sink.link_();
+                sink.tableCell_();
+                
+                ArtifactRepositoryPolicy releasePolicy = repo.getReleases();
+                tableCell( releasePolicy.isEnabled() ? releaseEnabled : releaseDisabled );
+
+                ArtifactRepositoryPolicy snapshotPolicy = repo.getSnapshots();
+                tableCell( snapshotPolicy.isEnabled() ? snapshotEnabled : snapshotDisabled );
+                sink.tableRow_();
+            }
+            
+            endTable();
+            
+            // Render Aritfact Breakdown.
+            
+            sink.paragraph();
+            sink.text( getReportString( "report.dependencies.repo.locations.artifact.breakdown" ) );
+            sink.paragraph_();
+            
+            List repoIdList = new ArrayList( repoMap.keySet() );
+
+            startTable();
+            String artifact = getReportString( "report.dependencies.repo.locations.column.artifact" );
+            tableHeader = new String[repoIdList.size() + 1];
+            tableHeader[0] = artifact;
+            int idnum = 1;
+            
+            for (Iterator it = repoIdList.iterator(); it.hasNext();)
+            {
+                String id = (String) it.next();
+                tableHeader[idnum++] = id;
+            }
+            
+            tableHeader( tableHeader );
+            
+            for ( Iterator it = alldeps.iterator(); it.hasNext(); )
+            {
+                Artifact dependency = (Artifact) it.next();
+                
+                if ( !Artifact.SCOPE_SYSTEM.equals( dependency.getScope() ) )
+                {
+                    sink.tableRow();
+                    
+                    tableCell( dependency.getId() );
+                    
+                    for(Iterator itrepo = repoIdList.iterator(); itrepo.hasNext();)
+                    {
+                        String repokey = (String) itrepo.next();
+                        ArtifactRepository repo = (ArtifactRepository) repoMap.get( repokey );
+                        
+                        String depUrl = repo.getUrl() + "/" + repo.pathOf( dependency );
+                        
+                        if(dependencyExistsInRepo(repo, dependency))
+                        {
+                            sink.tableCell();
+                            sink.link( depUrl );
+                            
+                            sink.figure();
+                            sink.figureCaption();
+                            sink.text( "Found at " + repo.getUrl() );
+                            sink.figureCaption_();
+                            sink.figureGraphics( "images/icon_success_sml.gif" );
+                            sink.figure_();
+                            
+                            sink.link_();
+                            sink.tableCell_();
+                        } else {
+                            sink.tableCell();
+                            sink.text("-");
+                            sink.tableCell_();
+                        }
+                    }
+                    
+                    sink.tableRow_();
+                }
+            }
+            
+            endTable();
+            
+            endSection();
+        }
+        
+        private boolean dependencyExistsInRepo( ArtifactRepository repo, Artifact artifact )
         {
-            Map dependenciesByScope = new HashMap();
-            for ( Iterator i = dependencies.iterator(); i.hasNext(); )
+            Wagon wagon;
+            
+            try
             {
-                ReportResolutionListener.Node node = (ReportResolutionListener.Node) i.next();
-                Artifact artifact = node.getArtifact();
+                wagon = wagonManager.getWagon(repo.getProtocol());
+            }
+            catch ( UnsupportedProtocolException e )
+            {
+                getLog().error( "Unsupported protocol: '" + repo.getProtocol() + "'", e );
+                return false;
+            }
+            
+            try
+            {
+                Debug debug = new Debug();
 
-                List multiValue = (List) dependenciesByScope.get( artifact.getScope() );
-                if ( multiValue == null )
+                wagon.addSessionListener( debug );
+                wagon.addTransferListener( debug );
+
+                String id = repo.getId();
+                Repository repository = new Repository( id, repo.getUrl() );
+                AuthenticationInfo auth = wagonManager.getAuthenticationInfo( repo.getId() );
+
+                ProxyInfo proxyInfo = getProxyInfo( settings );
+                if ( proxyInfo != null )
                 {
-                    multiValue = new ArrayList();
+                    wagon.connect( repository, auth, proxyInfo );
+                }
+                else
+                {
+                    wagon.connect( repository, auth );
+                }
+
+                return ( wagon.resourceExists( repo.pathOf( artifact ) ) );
+            }
+            catch ( ConnectionException e )
+            {
+                getLog().error( "Unable to connect to: " + repo.getUrl(), e );
+                return false;
+            }
+            catch ( AuthenticationException e )
+            {
+                getLog().error( "Unable to connect to: " + repo.getUrl(), e );
+                return false;
+            }
+            catch ( TransferFailedException e )
+            {
+                getLog().error( "Unable to determine if resource " + artifact + " exists in " + repo.getUrl(), e );
+                return false;
+            }
+            catch ( AuthorizationException e )
+            {
+                getLog().error( "Unable to connect to: " + repo.getUrl(), e );
+                return false;
+            }
+            finally
+            {
+                try
+                {
+                    wagon.disconnect();
+                }
+                catch ( ConnectionException e )
+                {
+                    getLog().error( "Error disconnecting wagon - ignored", e );
                 }
-                multiValue.add( artifact );
-                dependenciesByScope.put( artifact.getScope(), multiValue );
             }
-            return dependenciesByScope;
+        }
+        
+        /**
+         * Convenience method to map a <code>Proxy</code> object from the user system settings to a
+         * <code>ProxyInfo</code> object.
+         *
+         * @return a proxyInfo object instancied or null if no active proxy is define in the settings.xml
+         */
+        public ProxyInfo getProxyInfo( Settings settings )
+        {
+            ProxyInfo proxyInfo = null;
+            if ( settings != null && settings.getActiveProxy() != null )
+            {
+                Proxy settingsProxy = settings.getActiveProxy();
+
+                proxyInfo = new ProxyInfo();
+                proxyInfo.setHost( settingsProxy.getHost() );
+                proxyInfo.setType( settingsProxy.getProtocol() );
+                proxyInfo.setPort( settingsProxy.getPort() );
+                proxyInfo.setNonProxyHosts( settingsProxy.getNonProxyHosts() );
+                proxyInfo.setUserName( settingsProxy.getUsername() );
+                proxyInfo.setPassword( settingsProxy.getPassword() );
+            }
+
+            return proxyInfo;
+        }        
+
+        private void renderSectionDependencyListing()
+        {
+            startSection( getReportString( "report.dependencies.graph.tables.title" ) );
+            printDescriptionsAndURLs( listener.getRootNode() );
+            endSection();
         }
 
         private void renderDependenciesForScope( String scope, List artifacts, String[] tableHeader )
@@ -398,6 +968,7 @@
 
                     sink.paragraph();
                     sink.anchor( id );
+                    //                     startSection( artifactName );
                     sink.bold();
                     sink.text( artifactName );
                     sink.bold_();
@@ -419,6 +990,9 @@
                         sink.link_();
                         sink.paragraph_();
                     }
+
+                    //                    endSection();
+                    sink.horizontalRule();
                 }
                 catch ( ProjectBuildingException e )
                 {

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties?rev=431427&r1=431426&r2=431427&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties Mon Aug 14 13:13:45 2006
@@ -207,3 +207,25 @@
 report.summary.organization.title=Project Organization
 report.summary.organization.name=Name
 report.summary.organization.url=URL
+
+report.dependencies.file.details.title=Dependency File Details
+report.dependencies.file.details.column.file=Filename
+report.dependencies.file.details.column.size=Size
+report.dependencies.file.details.column.entries=Entries
+report.dependencies.file.details.column.classes=Classes
+report.dependencies.file.details.column.packages=Packages
+report.dependencies.file.details.column.jdkrev=JDK Rev
+report.dependencies.file.details.column.debug=Debug
+report.dependencies.file.details.column.sealed=Sealed
+
+report.dependencies.repo.locations.title=Dependency Repository Locations
+report.dependencies.repo.locations.column.artifact=Artifact
+report.dependencies.repo.locations.column.repoid=Repo ID
+report.dependencies.repo.locations.column.url=URL
+report.dependencies.repo.locations.column.release=Release
+report.dependencies.repo.locations.column.snapshot=Snapshot
+report.dependencies.repo.locations.cell.release.enabled=Yes
+report.dependencies.repo.locations.cell.release.disabled=-
+report.dependencies.repo.locations.cell.snapshot.enabled=Yes
+report.dependencies.repo.locations.cell.snapshot.disabled=-
+report.dependencies.repo.locations.artifact.breakdown=Repository locations for each of the Dependencies.