Author: hboutemy Date: Sat May 24 14:51:57 2014 New Revision: 1597312 URL: http://svn.apache.org/r1597312 Log: refactored code to better show the logic
Modified: maven/shared/trunk/maven-dependency-tree/src/it/reactor/verify.bsh maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java Modified: maven/shared/trunk/maven-dependency-tree/src/it/reactor/verify.bsh URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/it/reactor/verify.bsh?rev=1597312&r1=1597311&r2=1597312&view=diff ============================================================================== --- maven/shared/trunk/maven-dependency-tree/src/it/reactor/verify.bsh (original) +++ maven/shared/trunk/maven-dependency-tree/src/it/reactor/verify.bsh Sat May 24 14:51:57 2014 @@ -36,7 +36,7 @@ if ( !actual.equals( expected ) ) String resolved = FileUtils.fileRead( new File( basedir, "resolved-module-z-deps-y.txt" ) ); -if ( !"Could not resolve the following dependencies: [org.apache.maven.its.dependency-tree:module-y-deps-x:jar:1.0-SNAPSHOT (compile), org.apache.maven.its.dependency-tree:module-x:jar:1.0-SNAPSHOT (compile)]".equals( resolved ) ) +if ( !"Could not resolve following dependencies: [org.apache.maven.its.dependency-tree:module-y-deps-x:jar:1.0-SNAPSHOT (compile), org.apache.maven.its.dependency-tree:module-x:jar:1.0-SNAPSHOT (compile)]".equals( resolved ) ) { throw new Exception( "unexpected content in resolved-module-z-deps-y.txt written by ResolveDependenciesLifecycleParticipant" ); } Modified: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java?rev=1597312&r1=1597311&r2=1597312&view=diff ============================================================================== --- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java (original) +++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java Sat May 24 14:51:57 2014 @@ -46,14 +46,14 @@ public interface DependencyGraphBuilder /** * Build the dependency graph, with a hack to include dependencies contained in the reactor projects * but that are not yet compiled, which is the minimum prerequisite for Maven core's - * ReactorReader to find them. Notice that this hack doesn't work for Maven 2. + * ReactorReader to find them. Notice that this hack hasn't been done for Maven 2. * <p>Notice: If Maven core did collect instead of resolving dependencies (ie did not try to get the * artifacts but only the poms), probably this hack wouldn't be necessary even for people requiring * the dependency graph before compiling. TODO: for Maven 3, use Aether to collect dependencies.</p> * * @param project the project * @param filter artifact filter (can be <code>null</code>) - * @param reactorProjects Collection of those projects contained in the reactor. + * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>). * @return the dependency graph * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved. */ Modified: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java?rev=1597312&r1=1597311&r2=1597312&view=diff ============================================================================== --- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java (original) +++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java Sat May 24 14:51:57 2014 @@ -63,7 +63,7 @@ public class DefaultDependencyGraphBuild public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter ) throws DependencyGraphBuilderException { - return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() ); + return buildDependencyGraph( project, filter, null ); } /** @@ -71,7 +71,7 @@ public class DefaultDependencyGraphBuild * * @param project the project * @param filter artifact filter (can be <code>null</code>) - * @param reactorProjects Collection of those projects contained in the reactor. + * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>) * @return DependencyNode containing the dependency graph. * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved. */ Modified: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java?rev=1597312&r1=1597311&r2=1597312&view=diff ============================================================================== --- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java (original) +++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java Sat May 24 14:51:57 2014 @@ -73,12 +73,13 @@ public class Maven2DependencyGraphBuilde /** * Builds the dependency graph for Maven 2. - * - * NB the reactor projects are ignored as Maven 2 is not able to resolve projects from the reactor. - * - * @param project the project - * @param filter artifact filter (can be <code>null</code>) - * @param reactorProjects Ignored. + * <p> + * notice: the reactor projects are ignored as no work has been done to try to do the same hack as with Maven 3. + * </p> + * + * @param project the project + * @param filter artifact filter (can be <code>null</code>) + * @param reactorProjects Ignored. * @return DependencyNode containing the dependency graph. * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved. */ @@ -86,7 +87,11 @@ public class Maven2DependencyGraphBuilde Collection<MavenProject> reactorProjects ) throws DependencyGraphBuilderException { - getLogger().warn( "Reactor projects ignored - reactor dependencies cannot be resolved in Maven2" ); + if ( reactorProjects != null ) + { + getLogger().warn( "Reactor projects ignored - reactor project collection not implemented" ); + } + return buildDependencyGraph( project, filter ); } Modified: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java?rev=1597312&r1=1597311&r2=1597312&view=diff ============================================================================== --- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java (original) +++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java Sat May 24 14:51:57 2014 @@ -76,15 +76,16 @@ public class Maven31DependencyGraphBuild public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter ) throws DependencyGraphBuilderException { - return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() ); + return buildDependencyGraph( project, filter, null ); } /** - * Builds the dependency graph for Maven 3.1+ including any dependencies from any projects in the reactor. + * Builds the dependency graph for Maven 3.1+, eventually hacking for collecting projects from + * reactor not yet built. * * @param project the project * @param filter artifact filter (can be <code>null</code>) - * @param reactorProjects Collection of those projects contained in the reactor. + * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>). * @return DependencyNode containing the dependency graph. * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved. */ @@ -127,51 +128,51 @@ public class Maven31DependencyGraphBuild } catch ( DependencyResolutionException e ) { - // Ignore any resolution failure for deps that are part of the reactor but have not yet been built. - // NB Typing has been removed because DependencyResolutionResult returns Sonatype Aether in 3.0.4 and - // Eclipse Aether in 3.1.1 and while dep-tree is a single module we can only compile against one of them. - // - // NB While applying this code to Maven3DependencyGraphBuilder is trivial it won't work because - // in Maven 3, MavenProject.getProjectReferences isn't populated. So we would need to have the reactor - // modules passed in separately which would change the API for DependencyGraphBuilder. If - // MavenProject.getProjectReferences were populated (like it should be) then this would work for Maven3 too. - // - // NB There doesn't seem to be any way to apply this to Maven2DependencyGraphBuilder as there is no - // concept of partial resolution like there is is 3 and 3.1 - final DependencyResolutionResult result = e.getResult(); - - final List<Dependency> reactorDeps = - getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() ); - result.getUnresolvedDependencies().removeAll( reactorDeps ); - Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps ); - - if ( !result.getUnresolvedDependencies().isEmpty() ) + if ( reactorProjects == null ) { - throw new DependencyGraphBuilderException( "Could not resolve the following dependencies: " - + result.getUnresolvedDependencies(), e ); + throw new DependencyGraphBuilderException( "Could not resolve following dependencies: " + + e.getResult().getUnresolvedDependencies(), e ); } - getLogger().debug( "Resolved dependencies after ignoring reactor dependencies: " + reactorDeps ); + // try collecting from reactor + return collectDependenciesFromReactor( e, reactorProjects ); + } + } - return result; + private DependencyResolutionResult collectDependenciesFromReactor( DependencyResolutionException e, + Collection<MavenProject> reactorProjects ) + throws DependencyGraphBuilderException + { + DependencyResolutionResult result = e.getResult(); + + List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() ); + result.getUnresolvedDependencies().removeAll( reactorDeps ); + Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps ); + + if ( !result.getUnresolvedDependencies().isEmpty() ) + { + throw new DependencyGraphBuilderException( "Could not resolve nor collect following dependencies: " + + result.getUnresolvedDependencies(), e ); } + + return result; } private List<Dependency> getReactorDependencies( Collection<MavenProject> reactorProjects, List<?> dependencies ) { - final Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>(); - for ( final MavenProject project : reactorProjects ) + Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>(); + for ( MavenProject project : reactorProjects ) { reactorProjectsIds.add( new ArtifactKey( project ) ); } - final List<Dependency> reactorDeps = new ArrayList<Dependency>(); - for ( final Object untypedDependency : dependencies ) + List<Dependency> reactorDeps = new ArrayList<Dependency>(); + for ( Object untypedDependency : dependencies ) { - final Dependency dependency = (Dependency) untypedDependency; - final org.eclipse.aether.artifact.Artifact depArtifact = dependency.getArtifact(); + Dependency dependency = (Dependency) untypedDependency; + org.eclipse.aether.artifact.Artifact depArtifact = dependency.getArtifact(); - final ArtifactKey key = + ArtifactKey key = new ArtifactKey( depArtifact.getGroupId(), depArtifact.getArtifactId(), depArtifact.getVersion() ); if ( reactorProjectsIds.contains( key ) ) Modified: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java?rev=1597312&r1=1597311&r2=1597312&view=diff ============================================================================== --- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java (original) +++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java Sat May 24 14:51:57 2014 @@ -75,15 +75,16 @@ public class Maven3DependencyGraphBuilde public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter ) throws DependencyGraphBuilderException { - return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() ); + return buildDependencyGraph( project, filter, null ); } /** - * Builds the dependency graph for Maven 3 including any dependencies from any projects in the reactor. + * Builds the dependency graph for Maven 3, eventually hacking for collecting projects from + * reactor not yet built. * * @param project the project * @param filter artifact filter (can be <code>null</code>) - * @param reactorProjects Collection of those projects contained in the reactor. + * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>). * @return DependencyNode containing the dependency graph. * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved. */ @@ -97,7 +98,7 @@ public class Maven3DependencyGraphBuilde DependencyResolutionRequest request = new DefaultDependencyResolutionRequest( project, projectBuildingRequest.getRepositorySession() ); - final DependencyResolutionResult result = resolveDependencies( request, reactorProjects ); + DependencyResolutionResult result = resolveDependencies( request, reactorProjects ); return buildDependencyNode( null, result.getDependencyGraph(), project.getArtifact(), filter ); } @@ -112,52 +113,53 @@ public class Maven3DependencyGraphBuilde } catch ( DependencyResolutionException e ) { - // Ignore any resolution failure for deps that are part of the reactor but have not yet been built. - // NB Typing has been removed because DependencyResolutionResult returns Sonatype aether in 3.0.4 and - // Eclipse aether in 3.1.1 and while dep-tree is a single module we can only compile against one of them. - // - // NB While applying this code to Maven3DependencyGraphBuilder is trivial it won't work because - // in Maven 3, MavenProject.getProjectReferences isn't populated. So we would need to have the reactor - // modules passed in separately which would change the API for DependencyGraphBuilder. If - // MavenProject.getProjectReferences were populated (like it should be) then this would work for Maven3 too. - // - // NB There doesn't seem to be any way to apply this to Maven2DependencyGraphBuilder as there is no - // concept of partial resolution like there is is 3 and 3.1 - final DependencyResolutionResult result = e.getResult(); - - final List<Dependency> reactorDeps = - getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() ); - result.getUnresolvedDependencies().removeAll( reactorDeps ); - Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps ); - - if ( !result.getUnresolvedDependencies().isEmpty() ) + if ( reactorProjects == null ) { - throw new DependencyGraphBuilderException( "Could not resolve the following dependencies: " - + result.getUnresolvedDependencies(), e ); + throw new DependencyGraphBuilderException( "Could not resolve following dependencies: " + + e.getResult().getUnresolvedDependencies(), e ); } - getLogger().debug( "Resolved dependencies after ignoring reactor dependencies: " + reactorDeps ); + // try collecting from reactor + return collectDependenciesFromReactor( e, reactorProjects ); + } + } + + private DependencyResolutionResult collectDependenciesFromReactor( DependencyResolutionException e, + Collection<MavenProject> reactorProjects ) + throws DependencyGraphBuilderException + { + DependencyResolutionResult result = e.getResult(); + + List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() ); + + result.getUnresolvedDependencies().removeAll( reactorDeps ); + Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps ); - return result; + if ( !result.getUnresolvedDependencies().isEmpty() ) + { + throw new DependencyGraphBuilderException( "Could not resolve nor collect following dependencies: " + + result.getUnresolvedDependencies(), e ); } + + return result; } private List<org.sonatype.aether.graph.Dependency> getReactorDependencies( Collection<MavenProject> reactorProjects, List<?> dependencies ) { - final Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>(); - for ( final MavenProject project : reactorProjects ) + Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>(); + for ( MavenProject project : reactorProjects ) { reactorProjectsIds.add( new ArtifactKey( project ) ); } - final List<Dependency> reactorDeps = new ArrayList<Dependency>(); - for ( final Object untypedDependency : dependencies ) + List<Dependency> reactorDeps = new ArrayList<Dependency>(); + for ( Object untypedDependency : dependencies ) { - final Dependency dependency = (Dependency) untypedDependency; - final org.sonatype.aether.artifact.Artifact depArtifact = dependency.getArtifact(); + Dependency dependency = (Dependency) untypedDependency; + org.sonatype.aether.artifact.Artifact depArtifact = dependency.getArtifact(); - final ArtifactKey key = + ArtifactKey key = new ArtifactKey( depArtifact.getGroupId(), depArtifact.getArtifactId(), depArtifact.getVersion() ); if ( reactorProjectsIds.contains( key ) )