You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by br...@apache.org on 2006/09/12 05:07:25 UTC

svn commit: r442431 [2/2] - in /maven/plugins/trunk/maven-project-info-reports-plugin/src: main/java/org/apache/maven/report/projectinfo/ main/java/org/apache/maven/report/projectinfo/dependencies/ main/java/org/apache/maven/report/projectinfo/dependen...

Added: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/renderer/DependenciesRenderer.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/renderer/DependenciesRenderer.java?view=auto&rev=442431
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/renderer/DependenciesRenderer.java (added)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/renderer/DependenciesRenderer.java Mon Sep 11 20:07:24 2006
@@ -0,0 +1,776 @@
+package org.apache.maven.report.projectinfo.dependencies.renderer;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.model.License;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.report.projectinfo.dependencies.Dependencies;
+import org.apache.maven.report.projectinfo.dependencies.DependenciesReportConfiguration;
+import org.apache.maven.report.projectinfo.dependencies.JarDependencyDetails;
+import org.apache.maven.report.projectinfo.dependencies.ReportResolutionListener;
+import org.apache.maven.report.projectinfo.dependencies.RepositoryUtils;
+import org.apache.maven.reporting.AbstractMavenReportRenderer;
+import org.apache.maven.shared.jar.JarException;
+import org.codehaus.plexus.i18n.I18N;
+import org.codehaus.plexus.util.StringUtils;
+
+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.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+public class DependenciesRenderer
+    extends AbstractMavenReportRenderer
+{
+    private final Locale locale;
+
+    static HashSet JAR_SUBTYPE = new HashSet();
+
+    static
+    {
+        JAR_SUBTYPE.add( "jar" );
+        JAR_SUBTYPE.add( "war" );
+        JAR_SUBTYPE.add( "ear" );
+        JAR_SUBTYPE.add( "sar" );
+        JAR_SUBTYPE.add( "rar" );
+        JAR_SUBTYPE.add( "par" );
+        JAR_SUBTYPE.add( "ejb" );
+    }
+
+    private final ReportResolutionListener listener;
+
+    private Dependencies dependencies;
+
+    private DependenciesReportConfiguration configuration;
+
+    private I18N i18n;
+
+    private Log log;
+
+    private RepositoryUtils repoUtils;
+
+    /**
+     * Will be filled with license name / list of projects.
+     */
+    private Map licenseMap = new HashMap()
+    {
+        public Object put( Object key, Object value )
+        {
+            // handle multiple values as a list
+            List valueList = (List) get( key );
+            if ( valueList == null )
+            {
+                valueList = new ArrayList();
+            }
+            valueList.add( value );
+            return super.put( key, valueList );
+        }
+    };
+
+    public DependenciesRenderer( Sink sink, Locale locale, I18N _i18n, Dependencies _dependencies,
+                                 ReportResolutionListener listener, DependenciesReportConfiguration config,
+                                 RepositoryUtils _repoUtils )
+    {
+        super( sink );
+
+        this.locale = locale;
+
+        this.listener = listener;
+
+        this.repoUtils = _repoUtils;
+
+        this.dependencies = _dependencies;
+
+        this.i18n = _i18n;
+
+        this.configuration = config;
+    }
+
+    public void setLog( Log _log )
+    {
+        log = _log;
+    }
+
+    public String getTitle()
+    {
+        return getReportString( "report.dependencies.title" );
+    }
+
+    public void renderBody()
+    {
+        // Dependencies report
+
+        if ( !dependencies.hasDependencies() )
+        {
+            startSection( getTitle() );
+
+            // TODO: should the report just be excluded?
+            paragraph( getReportString( "report.dependencies.nolist" ) );
+
+            endSection();
+
+            return;
+        }
+
+        // === Section: Project Dependencies.
+        renderSectionProjectDependencies();
+
+        // === Section: Project Transitive Dependencies.
+        renderSectionProjectTransitiveDependencies();
+
+        // === Section: Project Dependency Graph.
+        renderSectionProjectDependencyGraph();
+
+        // === Section: Licenses
+        renderSectionDependencyLicenseListing();
+
+        if ( configuration.getDependencyDetailsEnabled() )
+        {
+            // === Section: Dependency File Details.
+            renderSectionDependencyFileDetails();
+        }
+
+        if ( configuration.getDependencyLocationsEnabled() )
+        {
+            // === Section: Dependency Repository Locations.
+            renderSectionDependencyRepositoryLocations();
+        }
+    }
+
+    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" );
+        return new String[]{groupId, artifactId, version, classifier, type, optional};
+    }
+
+    private void renderSectionProjectDependencies()
+    {
+        String[] tableHeader = getDependencyTableHeader();
+
+        startSection( getTitle() );
+
+        // collect dependencies by scope
+        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, (List) dependenciesByScope
+            .get( Artifact.SCOPE_PROVIDED ), tableHeader );
+        renderDependenciesForScope( Artifact.SCOPE_SYSTEM, (List) dependenciesByScope.get( Artifact.SCOPE_SYSTEM ),
+                                    tableHeader );
+    }
+
+    private void renderSectionProjectTransitiveDependencies()
+    {
+        List artifacts = dependencies.getTransitiveDependencies();
+
+        startSection( getReportString( "report.transitivedependencies.title" ) );
+
+        if ( artifacts.isEmpty() )
+        {
+            paragraph( getReportString( "report.transitivedependencies.nolist" ) );
+        }
+        else
+        {
+            String[] tableHeader = getDependencyTableHeader();
+            Map dependenciesByScope = dependencies.getDependenciesByScope();
+
+            paragraph( getReportString( "report.transitivedependencies.intro" ) );
+
+            renderDependenciesForAllScopes( tableHeader, dependenciesByScope );
+        }
+
+        endSection();
+    }
+
+    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();
+        sink.list();
+        printDependencyListing( listener.getRootNode() );
+        sink.list_();
+        sink.paragraph_();
+        endSection();
+    }
+
+    private void renderSectionDependencyFileDetails()
+    {
+        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() ) )
+            {
+                // TODO site:run Why do we need to resolve this...
+                if ( artifact.getFile() == null )
+                {
+                    try
+                    {
+                        repoUtils.resolve( artifact );
+                    }
+                    catch ( ArtifactResolutionException e )
+                    {
+                        log.error( "Artifact: " + artifact.getId() + " has no file.", e );
+                        continue;
+                    }
+                    catch ( ArtifactNotFoundException e )
+                    {
+                        log.error( "Artifact: " + artifact.getId() + " has no file.", e );
+                        continue;
+                    }
+                }
+
+                if ( artifact.getFile() == null )
+                {
+                    log.error( "Artifact: " + artifact.getId() + " has no file." );
+                    continue;
+                }
+
+                File artifactFile = artifact.getFile();
+
+                totaldeps++;
+                totaldepsize += artifactFile.length();
+
+                if ( JAR_SUBTYPE.contains( artifact.getType().toLowerCase() ) )
+                {
+                    try
+                    {
+                        JarDependencyDetails jarDetails = dependencies.getJarDependencyDetails( artifact );
+
+                        String debugstr = "release";
+                        if ( jarDetails.isDebugPresent() )
+                        {
+                            debugstr = "debug";
+                            totaldebug++;
+                        }
+
+                        String sealedstr = "";
+                        if ( jarDetails.isSealed() )
+                        {
+                            sealedstr = "sealed";
+                            totalsealed++;
+                        }
+
+                        totalentries += jarDetails.getEntries();
+                        totalclasses += jarDetails.getClassSize();
+                        totalpackages += jarDetails.getPackageSize();
+
+                        try
+                        {
+                            highestjdk = Math.max( highestjdk, Double.parseDouble( jarDetails.getJdkRevision() ) );
+                        }
+                        catch ( NumberFormatException e )
+                        {
+                            // ignore
+                        }
+
+                        tableRow( new String[]{artifactFile.getName(), decFormat.format( artifactFile.length() ),
+                            decFormat.format( jarDetails.getEntries() ), decFormat.format( jarDetails.getClassSize() ),
+                            decFormat.format( jarDetails.getPackageSize() ), jarDetails.getJdkRevision(), debugstr,
+                            sealedstr} );
+                    }
+                    catch ( JarException e )
+                    {
+                        createExceptionInfoTableRow( artifact, artifactFile, e );
+                    }
+                }
+                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 createExceptionInfoTableRow( Artifact artifact, File artifactFile, Exception e )
+    {
+        tableRow( new String[]{artifact.getId(), artifactFile.getAbsolutePath(), e.getMessage(), "", "", "", "", ""} );
+    }
+
+    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()
+    {
+        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, repoUtils.getRemoteArtifactRepositories() );
+
+        for ( Iterator it = alldeps.iterator(); it.hasNext(); )
+        {
+            Artifact artifact = (Artifact) it.next();
+            try
+            {
+                MavenProject artifactProject =
+                    repoUtils.getMavenProjectFromRepository( artifact, repoUtils.getLocalRepository() );
+
+                populateRepositoryMap( repoMap, artifactProject.getRemoteArtifactRepositories() );
+            }
+            catch ( ProjectBuildingException e )
+            {
+                log.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() );
+
+            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 );
+
+                    boolean dependencyExists = false;
+
+                    // check snapshots in snapshots repository only and releases in release repositories...
+                    if ( ( dependency.isSnapshot() && repo.getSnapshots().isEnabled() ) ||
+                        ( !dependency.isSnapshot() && repo.getReleases().isEnabled() ) )
+                    {
+                        dependencyExists = repoUtils.dependencyExistsInRepo( repo, dependency );
+                    }
+
+                    if ( dependencyExists )
+                    {
+                        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 void renderSectionDependencyListing()
+    {
+        startSection( getReportString( "report.dependencies.graph.tables.title" ) );
+        printDescriptionsAndURLs( listener.getRootNode() );
+        endSection();
+    }
+
+    private void renderSectionDependencyLicenseListing()
+    {
+        startSection( getReportString( "report.dependencies.graph.tables.licenses" ) );
+        printGroupedLicenses();
+        endSection();
+    }
+
+    private void renderDependenciesForScope( String scope, List artifacts, String[] tableHeader )
+    {
+        if ( artifacts != null )
+        {
+            // can't use straight artifact comparison because we want optional last
+            Collections.sort( artifacts, getArtifactComparator() );
+
+            startSection( scope );
+
+            paragraph( getReportString( "report.dependencies.intro." + scope ) );
+            startTable();
+            tableHeader( tableHeader );
+
+            for ( Iterator iterator = artifacts.iterator(); iterator.hasNext(); )
+            {
+                Artifact artifact = (Artifact) iterator.next();
+                tableRow( getArtifactRow( artifact ) );
+            }
+            endTable();
+
+            endSection();
+        }
+    }
+
+    private Comparator getArtifactComparator()
+    {
+        return new Comparator()
+        {
+            public int compare( Object o1, Object o2 )
+            {
+                Artifact a1 = (Artifact) o1;
+                Artifact a2 = (Artifact) o2;
+
+                // put optional last
+                if ( a1.isOptional() && !a2.isOptional() )
+                {
+                    return +1;
+                }
+                else if ( !a1.isOptional() && a2.isOptional() )
+                {
+                    return -1;
+                }
+                else
+                {
+                    return a1.compareTo( a2 );
+                }
+            }
+        };
+    }
+
+    private String[] getArtifactRow( Artifact artifact )
+    {
+        return new String[]{artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(),
+            artifact.getClassifier(), artifact.getType(), artifact.isOptional() ? "(optional)" : " "};
+    }
+
+    private void printDependencyListing( ReportResolutionListener.Node node )
+    {
+        Artifact artifact = node.getArtifact();
+        String id = artifact.getDependencyConflictId();
+
+        sink.listItem();
+        sink.paragraph();
+
+        sink.link( "#" + id );
+        sink.text( id );
+        sink.link_();
+
+        if ( !node.getChildren().isEmpty() )
+        {
+            sink.list();
+            for ( Iterator deps = node.getChildren().iterator(); deps.hasNext(); )
+            {
+                ReportResolutionListener.Node dep = (ReportResolutionListener.Node) deps.next();
+                printDependencyListing( dep );
+            }
+            sink.list_();
+        }
+
+        sink.paragraph_();
+        sink.listItem_();
+    }
+
+    private void printDescriptionsAndURLs( ReportResolutionListener.Node node )
+    {
+        Artifact artifact = node.getArtifact();
+        String id = artifact.getDependencyConflictId();
+
+        String unknownLicenseMessage = getReportString( "report.dependencies.graph.tables.unknown" );
+
+        if ( !Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
+        {
+            try
+            {
+                MavenProject artifactProject =
+                    repoUtils.getMavenProjectFromRepository( artifact, repoUtils.getLocalRepository() );
+                String artifactDescription = artifactProject.getDescription();
+                String artifactUrl = artifactProject.getUrl();
+                String artifactName = artifactProject.getName();
+                List licenses = artifactProject.getLicenses();
+
+                sink.paragraph();
+                sink.anchor( id );
+                // startSection( artifactName );
+                sink.bold();
+                sink.text( artifactName );
+                sink.bold_();
+                sink.anchor_();
+                sink.paragraph_();
+
+                if ( artifactDescription != null )
+                {
+                    sink.paragraph();
+                    sink.text( artifactDescription );
+                    sink.paragraph_();
+                }
+
+                if ( artifactUrl != null )
+                {
+                    sink.paragraph();
+                    sink.link( artifactUrl );
+                    sink.text( artifactUrl );
+                    sink.link_();
+                    sink.paragraph_();
+                }
+
+                sink.paragraph();
+                sink.text( getReportString( "report.license.title" ) + ": " );
+                if ( !licenses.isEmpty() )
+                {
+                    for ( Iterator iter = licenses.iterator(); iter.hasNext(); )
+                    {
+                        License element = (License) iter.next();
+                        String licenseName = element.getName();
+                        String licenseUrl = element.getUrl();
+
+                        if ( licenseUrl != null )
+                        {
+                            sink.link( licenseUrl );
+                        }
+                        sink.text( licenseName );
+
+                        if ( licenseUrl != null )
+                        {
+                            sink.link_();
+                        }
+
+                        licenseMap.put( licenseName, artifactName );
+
+                    }
+                }
+                else
+                {
+                    sink.text( getReportString( "report.license.nolicense" ) );
+
+                    licenseMap.put( unknownLicenseMessage, artifactName );
+
+                }
+                sink.paragraph_();
+
+                // endSection();
+                sink.horizontalRule();
+            }
+            catch ( ProjectBuildingException e )
+            {
+                log.error( "ProjectBuildException error : ", e );
+            }
+
+            for ( Iterator deps = node.getChildren().iterator(); deps.hasNext(); )
+            {
+                ReportResolutionListener.Node dep = (ReportResolutionListener.Node) deps.next();
+                printDescriptionsAndURLs( dep );
+            }
+        }
+        else
+        {
+            sink.paragraph();
+            sink.anchor( id );
+            sink.bold();
+            sink.text( id );
+            sink.bold_();
+            sink.anchor_();
+            sink.paragraph_();
+
+            sink.paragraph();
+            sink.text( artifact.getFile().toString() );
+            sink.paragraph_();
+        }
+    }
+
+    private void printGroupedLicenses()
+    {
+        for ( Iterator iter = licenseMap.keySet().iterator(); iter.hasNext(); )
+        {
+            String licenseName = (String) iter.next();
+            sink.paragraph();
+            sink.bold();
+            if ( StringUtils.isEmpty( licenseName ) )
+            {
+                sink.text( i18n.getString( "project-info-report", locale, "report.dependencies.unamed" ) );
+            }
+            else
+            {
+                sink.text( licenseName );
+            }
+            sink.text( ": " );
+            sink.bold_();
+
+            List projects = (List) licenseMap.get( licenseName );
+            Collections.sort( projects );
+
+            for ( Iterator iterator = projects.iterator(); iterator.hasNext(); )
+            {
+                String projectName = (String) iterator.next();
+                sink.text( projectName );
+                if ( iterator.hasNext() )
+                {
+                    sink.text( "," );
+                }
+                sink.text( " " );
+            }
+
+            sink.paragraph_();
+        }
+    }
+
+    private String getReportString( String key )
+    {
+        return i18n.getString( "project-info-report", locale, key );
+    }
+}

Propchange: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/renderer/DependenciesRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: maven/plugins/trunk/maven-project-info-reports-plugin/src/test/java/org/apache/maven/report/projectinfo/dependencies/ReportResolutionListenerTest.java (from r442415, maven/plugins/trunk/maven-project-info-reports-plugin/src/test/java/org/apache/maven/report/projectinfo/ReportResolutionListenerTest.java)
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/test/java/org/apache/maven/report/projectinfo/dependencies/ReportResolutionListenerTest.java?view=diff&rev=442431&p1=maven/plugins/trunk/maven-project-info-reports-plugin/src/test/java/org/apache/maven/report/projectinfo/ReportResolutionListenerTest.java&r1=442415&p2=maven/plugins/trunk/maven-project-info-reports-plugin/src/test/java/org/apache/maven/report/projectinfo/dependencies/ReportResolutionListenerTest.java&r2=442431
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/test/java/org/apache/maven/report/projectinfo/ReportResolutionListenerTest.java (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/test/java/org/apache/maven/report/projectinfo/dependencies/ReportResolutionListenerTest.java Mon Sep 11 20:07:24 2006
@@ -1,4 +1,4 @@
-package org.apache.maven.report.projectinfo;
+package org.apache.maven.report.projectinfo.dependencies;
 
 /*
  * Copyright 2004-2006 The Apache Software Foundation.