Author: epunzalan Date: Wed Mar 8 03:33:26 2006 New Revision: 384184 URL: http://svn.apache.org/viewcvs?rev=384184&view=rev Log: PR: MPIR-11
Replaced @requiresDependencyResolution with manual resolution so that a listener can be passed to create the dependency tree. Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependenciesReport.java?rev=384184&r1=384183&r2=384184&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 Wed Mar 8 03:33:26 2006 @@ -18,7 +18,16 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.resolver.ArtifactNotFoundException; +import org.apache.maven.artifact.resolver.ArtifactResolutionException; +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.artifact.resolver.ResolutionListener; +import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; +import org.apache.maven.artifact.versioning.VersionRange; +import org.apache.maven.model.Dependency; +import org.apache.maven.model.DependencyManagement; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.project.ProjectBuildingException; @@ -47,7 +56,6 @@ * @version $Id$ * @goal dependencies * @plexus.component - * @requiresDependencyResolution */ public class DependenciesReport extends AbstractMavenReport @@ -97,6 +105,20 @@ private MavenProjectBuilder mavenProjectBuilder; /** + * Maven Artifact Resolver + * + * @parameter expression="${component.org.apache.maven.artifact.resolver.ArtifactResolver}" + * @required + * @readonly + */ + private ArtifactResolver artifactResolver; + + /** + * @parameter expression="${component.org.apache.maven.artifact.metadata.ArtifactMetadataSource}" + */ + protected ArtifactMetadataSource artifactMetadataSource; + + /** * Local Repository. * * @parameter expression="${localRepository}" @@ -165,9 +187,66 @@ */ public void executeReport( Locale locale ) { - DependenciesRenderer r = new DependenciesRenderer( getSink(), locale ); + try + { + ReportResolutionListener listener = resolveProject(); + + DependenciesRenderer r = new DependenciesRenderer( getSink(), locale, listener.getDirectDependencies(), listener.getTransitiveDependencies() ); + + r.render(); + } + catch ( Exception e ) + { + getLog().error( "An error occurred while resolving project dependencies.", e ); + } + } + + private ReportResolutionListener resolveProject() + throws ArtifactNotFoundException, ArtifactResolutionException, ProjectBuildingException + { + Map managedVersions = createManagedVersionMap( project.getId(), project.getDependencyManagement() ); + + ReportResolutionListener listener = new ReportResolutionListener(); + + artifactResolver.resolveTransitively( project.getDependencyArtifacts(), project.getArtifact(), + managedVersions, localRepository, + project.getRemoteArtifactRepositories(), artifactMetadataSource, null, + Collections.singletonList( listener ) ); - r.render(); + return listener; + } + + private Map createManagedVersionMap( String projectId, DependencyManagement dependencyManagement ) + throws ProjectBuildingException + { + Map map; + if ( dependencyManagement != null && dependencyManagement.getDependencies() != null ) + { + map = new HashMap(); + for ( Iterator i = dependencyManagement.getDependencies().iterator(); i.hasNext(); ) + { + Dependency d = (Dependency) i.next(); + + try + { + VersionRange versionRange = VersionRange.createFromVersionSpec( d.getVersion() ); + Artifact artifact = artifactFactory.createDependencyArtifact( d.getGroupId(), d.getArtifactId(), + versionRange, d.getType(), + d.getClassifier(), d.getScope() ); + map.put( d.getManagementKey(), artifact ); + } + catch ( InvalidVersionSpecificationException e ) + { + throw new ProjectBuildingException( projectId, "Unable to parse version '" + d.getVersion() + + "' for dependency '" + d.getManagementKey() + "': " + e.getMessage(), e ); + } + } + } + else + { + map = Collections.EMPTY_MAP; + } + return map; } /** @@ -183,29 +262,37 @@ { private Locale locale; - public DependenciesRenderer( Sink sink, Locale locale ) + private Map directDep; + + private Map transitiveDep; + + public DependenciesRenderer( Sink sink, Locale locale, Map directDependencies, Map transitiveDependencies ) { super( sink ); this.locale = locale; + + this.directDep = directDependencies; + + this.transitiveDep = transitiveDependencies; } public String getTitle() { - return i18n.getString( "project-info-report", locale, "report.dependencies.title" ); + return getReportString( "report.dependencies.title" ); } public void renderBody() { // Dependencies report - Set dependencies = project.getDependencyArtifacts(); + Set dependencies = new HashSet( directDep.values() ); - if ( dependencies == null || dependencies.isEmpty() ) + if ( dependencies.isEmpty() ) { startSection( getTitle() ); // TODO: should the report just be excluded? - paragraph( i18n.getString( "project-info-report", locale, "report.dependencies.nolist" ) ); + paragraph( getReportString( "report.dependencies.nolist" ) ); endSection(); @@ -214,14 +301,12 @@ startSection( getTitle() ); - String groupId = i18n.getString( "project-info-report", locale, "report.dependencies.column.groupId" ); - String artifactId = - i18n.getString( "project-info-report", locale, "report.dependencies.column.artifactId" ); - String version = i18n.getString( "project-info-report", locale, "report.dependencies.column.version" ); - String description = - i18n.getString( "project-info-report", locale, "report.dependencies.column.description" ); - String url = i18n.getString( "project-info-report", locale, "report.dependencies.column.url" ); - String optional = i18n.getString( "project-info-report", locale, "report.dependencies.column.optional" ); + String groupId = getReportString( "report.dependencies.column.groupId" ); + String artifactId = getReportString( "report.dependencies.column.artifactId" ); + String version = getReportString( "report.dependencies.column.version" ); + String description = getReportString( "report.dependencies.column.description" ); + String url = getReportString( "report.dependencies.column.url" ); + String optional = getReportString( "report.dependencies.column.optional" ); // collect dependencies by scope Map dependenciesByScope = new HashMap() @@ -277,7 +362,7 @@ startSection( scope ); - paragraph( i18n.getString( "project-info-report", locale, "report.dependencies.intro." + scope ) ); + paragraph( getReportString( "report.dependencies.intro." + scope ) ); startTable(); tableHeader( new String[]{groupId, artifactId, version, description, url, optional} ); @@ -307,17 +392,17 @@ endSection(); // Transitive dependencies - Set artifacts = getTransitiveDependencies( project ); + Set artifacts = new HashSet( transitiveDep.values() ); - startSection( i18n.getString( "project-info-report", locale, "report.transitivedependencies.title" ) ); + startSection( getReportString( "report.transitivedependencies.title" ) ); if ( artifacts.isEmpty() ) { - paragraph( i18n.getString( "project-info-report", locale, "report.transitivedependencies.nolist" ) ); + paragraph( getReportString( "report.transitivedependencies.nolist" ) ); } else { - paragraph( i18n.getString( "project-info-report", locale, "report.transitivedependencies.intro" ) ); + paragraph( getReportString( "report.transitivedependencies.intro" ) ); startTable(); @@ -359,38 +444,23 @@ } endSection(); - } - /** - * Return a set of <code>Artifacts</code> which are not already - * present in the dependencies list. - * - * @param project a Maven project - * @return a set of transitive dependencies as artifacts - */ - private Set getTransitiveDependencies( MavenProject project ) - { - Set transitiveDependencies = new HashSet(); + //for Dependencies Graph + startSection( "report.dependencies.graph.title" ); - Set dependencies = project.getDependencyArtifacts(); - Set artifacts = project.getArtifacts(); + startSection( "report.dependencies.graph.tree.title" ); - if ( dependencies == null || artifacts == null ) - { - return transitiveDependencies; - } - for ( Iterator j = artifacts.iterator(); j.hasNext(); ) - { - Artifact artifact = (Artifact) j.next(); - if ( !dependencies.contains( artifact ) ) - { - transitiveDependencies.add( artifact ); - } - } + endSection(); + + startSection( "report.dependencies.graph.tables.title" ); + + + + endSection(); - return transitiveDependencies; + endSection(); } /** @@ -419,5 +489,164 @@ return mavenProjectBuilder.buildFromRepository( projectArtifact, project.getRemoteArtifactRepositories(), localRepository, allowStubModel ); } + + private String getReportString( String key ) + { + return i18n.getString( "project-info-report", locale, key ); + } + + } + + private class ReportResolutionListener + implements ResolutionListener + { + private Map directDep = new HashMap(); + + private Map transitiveDep = new HashMap(); + + private Map replacedDep = new HashMap(); + + private List parents = new ArrayList(); + + private Map depTree = new HashMap(); + + public void testArtifact( Artifact node ) + { + + } + + public void startProcessChildren( Artifact artifact ) + { + parents.add( artifact ); + } + + public void endProcessChildren( Artifact artifact ) + { + parents.remove( artifact ); + } + + public void includeArtifact( Artifact artifact ) + { + addDependency( artifact ); + + if ( parents.size() > 0 ) + { + Artifact parent = (Artifact) parents.get( parents.size() - 1 ); + + if ( depTree.containsKey( parent.getId() ) ) + { + List deps = (List) depTree.get( parent.getId() ); + + deps.add( artifact ); + } + else + { + List deps = new ArrayList(); + deps.add( artifact ); + depTree.put( parent.getId(), deps ); + } + } + } + + public void omitForNearer( Artifact omitted, Artifact kept ) + { + String key = omitted.getId(); + + replacedDep.put( key, omitted ); + + if ( directDep.containsKey( key ) ) + { + directDep.remove( key ); + } + else if ( transitiveDep.containsKey( key ) ) + { + transitiveDep.remove( key ); + } + + addDependency( kept ); + } + + private void addDependency( Artifact artifact ) + { + if ( parents.size() == 0 ) + { + //do nothing... artifact is current project + } + else if ( parents.size() == 1 ) + { + if ( !directDep.containsKey( artifact.getId() ) ) + { + directDep.put( artifact.getId(), artifact ); + } + } + else + { + if ( !transitiveDep.containsKey( artifact.getId() ) ) + { + transitiveDep.put( artifact.getId(), artifact ); + } + } + } + + public void updateScope( Artifact artifact, String scope ) + { + + } + + public void manageArtifact( Artifact artifact, Artifact replacement ) + { + omitForNearer( artifact, replacement ); + } + + public void omitForCycle( Artifact artifact ) + { + replacedDep.put( artifact.getId(), artifact ); + } + + public void updateScopeCurrentPom( Artifact artifact, String scope ) + { + + } + + public void selectVersionFromRange( Artifact artifact ) + { + + } + + public void restrictRange( Artifact artifact, Artifact replacement, VersionRange newRange ) + { + + } + + public Set getArtifacts() + { + Set all = new HashSet(); + + all.addAll( directDep.values() ); + + all.addAll( transitiveDep.values() ); + + return all; + } + + public Map getTransitiveDependencies() + { + return Collections.unmodifiableMap( transitiveDep ); + } + + public Map getDirectDependencies() + { + return Collections.unmodifiableMap( directDep ); + } + + public Map getOmittedArtifacts() + { + return Collections.unmodifiableMap( replacedDep ); + } + + public Map getDepTree() + { + return depTree; + } } -} \ No newline at end of file +}