blob: 961dc7ca8bd7daef92ac036d5f64bb92669df19e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.maven.lifecycle.internal.stub;
import org.apache.maven.execution.AbstractExecutionListener;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ProjectDependencyGraph;
import org.apache.maven.lifecycle.LifecycleNotFoundException;
import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException;
import org.apache.maven.lifecycle.internal.GoalTask;
import org.apache.maven.lifecycle.internal.ProjectBuildList;
import org.apache.maven.lifecycle.internal.ProjectSegment;
import org.apache.maven.lifecycle.internal.TaskSegment;
import org.apache.maven.plugin.InvalidPluginDescriptorException;
import org.apache.maven.plugin.MojoNotFoundException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.PluginResolutionException;
import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.project.MavenProject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* A stub dependency graph that is custom-made for testing concurrent build graph evaluations.
* <p>
* Implements a graph as follows:
* A has no dependencies
* B depends on A
* C depends on A
* X depends on B &amp; C
* Y depends on B
* Z depends on C
* </p>
*
* @author Kristian Rosenvold
*/
public class ProjectDependencyGraphStub
implements ProjectDependencyGraph
{
public static final MavenProject A = new MavenProject();
public static final MavenProject B = new MavenProject();
public static final MavenProject C = new MavenProject();
public static final MavenProject X = new MavenProject();
public static final MavenProject Y = new MavenProject();
public static final MavenProject Z = new MavenProject();
public static final MavenProject UNKNOWN = new MavenProject();
static
{
A.setArtifactId( "A" );
B.setArtifactId( "B" );
C.setArtifactId( "C" );
X.setArtifactId( "X" );
Y.setArtifactId( "Y" );
Z.setArtifactId( "Z" );
}
// This should probably be moved to a separate stub
public static ProjectBuildList getProjectBuildList( MavenSession session )
throws InvalidPluginDescriptorException, PluginVersionResolutionException, PluginDescriptorParsingException,
NoPluginFoundForPrefixException, MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
LifecyclePhaseNotFoundException, LifecycleNotFoundException
{
final List<ProjectSegment> list = getProjectBuilds( session );
return new ProjectBuildList( list );
}
public static List<ProjectSegment> getProjectBuilds( MavenSession session )
throws InvalidPluginDescriptorException, PluginVersionResolutionException, PluginDescriptorParsingException,
NoPluginFoundForPrefixException, PluginNotFoundException, MojoNotFoundException, PluginResolutionException,
LifecyclePhaseNotFoundException, LifecycleNotFoundException
{
List<ProjectSegment> projectBuilds = new ArrayList<>();
TaskSegment segment = createTaskSegment();
projectBuilds.add( createProjectBuild( A, session, segment ) );
projectBuilds.add( createProjectBuild( B, session, segment ) );
projectBuilds.add( createProjectBuild( C, session, segment ) );
projectBuilds.add( createProjectBuild( X, session, segment ) );
projectBuilds.add( createProjectBuild( Y, session, segment ) );
projectBuilds.add( createProjectBuild( Z, session, segment ) );
return projectBuilds;
}
private static ProjectSegment createProjectBuild( MavenProject project, MavenSession session,
TaskSegment taskSegment )
throws InvalidPluginDescriptorException, PluginVersionResolutionException, PluginDescriptorParsingException,
NoPluginFoundForPrefixException, MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
LifecyclePhaseNotFoundException, LifecycleNotFoundException
{
final MavenSession session1 = session.clone();
return new ProjectSegment( project, taskSegment, session1 );
}
private static TaskSegment createTaskSegment()
{
TaskSegment result = new TaskSegment( false );
result.getTasks().add( new GoalTask( "t1" ) );
result.getTasks().add( new GoalTask( "t2" ) );
return result;
}
class Dependency
{
MavenProject dependant;
MavenProject dependency;
Dependency( MavenProject dependant, MavenProject dependency )
{
this.dependant = dependant;
this.dependency = dependency;
}
void addIfDownstream( MavenProject mavenProject, List<MavenProject> result )
{
if ( dependency == mavenProject )
{
result.add( dependant );
}
}
void addIfUpstreamOf( MavenProject mavenProject, List<MavenProject> result )
{
if ( dependant == mavenProject )
{
result.add( dependency ); // All projects are the statics from this class
}
}
}
private List<Dependency> getDependencies()
{
List<Dependency> dependencies = new ArrayList<>();
dependencies.add( new Dependency( B, A ) );
dependencies.add( new Dependency( C, A ) );
dependencies.add( new Dependency( X, B ) );
dependencies.add( new Dependency( X, C ) );
dependencies.add( new Dependency( Y, B ) );
dependencies.add( new Dependency( Z, C ) );
return dependencies;
}
public List<MavenProject> getAllProjects()
{
return Arrays.asList( A, B, C, X, Y, Z, UNKNOWN );
}
public List<MavenProject> getSortedProjects()
{
return Arrays.asList( A, B, C, X, Y, Z ); // I'm not entirely sure about the order but this should do...
}
public List<MavenProject> getDownstreamProjects( MavenProject project, boolean transitive )
{
if ( transitive )
{
throw new RuntimeException( "Not implemented yet" );
}
List<MavenProject> result = new ArrayList<>();
for ( Dependency dependency : getDependencies() )
{
dependency.addIfDownstream( project, result );
}
return result;
}
public List<MavenProject> getUpstreamProjects( MavenProject project, boolean transitive )
{
/* if ( transitive )
{
throw new RuntimeException( "Not implemented yet" );
}*/
List<MavenProject> result = new ArrayList<>();
final List<Dependency> dependencies = getDependencies();
for ( Dependency dependency : dependencies )
{
dependency.addIfUpstreamOf( project, result );
}
return result;
}
public static MavenSession getMavenSession( MavenProject mavenProject )
{
final MavenSession session = getMavenSession();
session.setCurrentProject( mavenProject );
return session;
}
public static MavenSession getMavenSession()
{
final DefaultMavenExecutionResult defaultMavenExecutionResult = new DefaultMavenExecutionResult();
MavenExecutionRequest mavenExecutionRequest = new DefaultMavenExecutionRequest();
mavenExecutionRequest.setExecutionListener( new AbstractExecutionListener() );
mavenExecutionRequest.setGoals( Arrays.asList( "clean", "aggr", "install" ) );
mavenExecutionRequest.setDegreeOfConcurrency( 1 );
final MavenSession session = new MavenSession( null, null, mavenExecutionRequest, defaultMavenExecutionResult );
final ProjectDependencyGraphStub dependencyGraphStub = new ProjectDependencyGraphStub();
session.setProjectDependencyGraph( dependencyGraphStub );
session.setProjects( dependencyGraphStub.getSortedProjects() );
return session;
}
}