Author: dfabulich Date: Wed Aug 20 10:19:21 2008 New Revision: 687388 URL: http://svn.apache.org/viewvc?rev=687388&view=rev Log: [MNG-2576] First cut at Make Like Reactor Mode
Added: maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/MissingProjectException.java Modified: maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/DefaultMaven.java maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/cli/MavenCli.java maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java maven/components/branches/maven-2.1.x/maven-core/src/test/java/org/apache/maven/plugin/PluginParameterExpressionEvaluatorTest.java maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/ProjectSorterTest.java Modified: maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/DefaultMaven.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/DefaultMaven.java?rev=687388&r1=687387&r2=687388&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/DefaultMaven.java (original) +++ maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/DefaultMaven.java Wed Aug 20 10:19:21 2008 @@ -42,6 +42,7 @@ import org.apache.maven.project.DuplicateProjectException; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; +import org.apache.maven.project.MissingProjectException; import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.reactor.MavenExecutionException; import org.apache.maven.settings.Mirror; @@ -299,14 +300,16 @@ ReactorManager rm; try { - rm = new ReactorManager( projects ); - - String requestFailureBehavior = request.getFailureBehavior(); + String resumeFrom = request.getResumeFrom(); + + List projectList = request.getSelectedProjects(); + + String makeBehavior = request.getMakeBehavior(); + + rm = new ReactorManager( projects, projectList, resumeFrom, makeBehavior ); - if ( requestFailureBehavior != null ) - { - rm.setFailureBehavior( requestFailureBehavior ); - } + rm.setFailureBehavior( request.getFailureBehavior() ); + } catch ( CycleDetectedException e ) { @@ -317,6 +320,10 @@ { throw new BuildFailureException( e.getMessage(), e ); } + catch ( MissingProjectException e ) + { + throw new BuildFailureException( e.getMessage(), e ); + } if ( rm.hasMultipleProjects() ) { Modified: maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/cli/MavenCli.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/cli/MavenCli.java?rev=687388&r1=687387&r2=687388&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/cli/MavenCli.java (original) +++ maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/cli/MavenCli.java Wed Aug 20 10:19:21 2008 @@ -55,6 +55,7 @@ import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.logging.LoggerManager; import org.codehaus.plexus.util.Os; +import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.cli.CommandLineUtils; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; @@ -62,6 +63,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -473,6 +475,32 @@ { request.setPomFile( commandLine.getOptionValue( CLIManager.ALTERNATE_POM_FILE ) ); } + + if ( commandLine.hasOption( CLIManager.RESUME_FROM ) ) + { + request.setResumeFrom( commandLine.getOptionValue( CLIManager.RESUME_FROM ) ); + } + + if ( commandLine.hasOption( CLIManager.PROJECT_LIST ) ) + { + String projectList = commandLine.getOptionValue( CLIManager.PROJECT_LIST ); + String[] projects = StringUtils.split( projectList, "," ); + request.setSelectedProjects( Arrays.asList( projects ) ); + } + + if ( commandLine.hasOption( CLIManager.ALSO_MAKE ) && !commandLine.hasOption( CLIManager.ALSO_MAKE_DEPENDENTS ) ) + { + request.setMakeBehavior( ReactorManager.MAKE_MODE ); + } + else if ( !commandLine.hasOption( CLIManager.ALSO_MAKE ) + && commandLine.hasOption( CLIManager.ALSO_MAKE_DEPENDENTS ) ) + { + request.setMakeBehavior( ReactorManager.MAKE_DEPENDENTS_MODE ); + } + if ( commandLine.hasOption( CLIManager.ALSO_MAKE ) && commandLine.hasOption( CLIManager.ALSO_MAKE_DEPENDENTS ) ) + { + request.setMakeBehavior( ReactorManager.MAKE_BOTH_MODE ); + } } private static Maven createMavenInstance( boolean interactive ) @@ -721,6 +749,14 @@ private static final String FAIL_AT_END = "fae"; private static final String FAIL_NEVER = "fn"; + + private static final String RESUME_FROM = "rf"; + + private static final String PROJECT_LIST = "pl"; + + private static final String ALSO_MAKE = "am"; + + private static final String ALSO_MAKE_DEPENDENTS = "amd"; public CLIManager() { @@ -792,6 +828,14 @@ options.addOption( OptionBuilder.withLongOpt( "show-version" ).withDescription( "Display version information WITHOUT stopping build" ).create( SHOW_VERSION ) ); + options.addOption( OptionBuilder.withLongOpt( "resume-from" ).hasArg().withDescription( "Resume reactor from specified project" ).create( + RESUME_FROM ) ); + options.addOption( OptionBuilder.withLongOpt( "projects" ).withDescription( + "Build specified reactor projects instead of all projects" ).hasArg().create( PROJECT_LIST ) ); + options.addOption( OptionBuilder.withLongOpt( "also-make" ).withDescription( + "If project list is specified, also build projects required by the list" ).create( ALSO_MAKE ) ); + options.addOption( OptionBuilder.withLongOpt( "also-make-dependents" ).withDescription( + "If project list is specified, also build projects that depend on projects on the list" ).create( ALSO_MAKE_DEPENDENTS ) ); } public CommandLine parse( String[] args ) Modified: maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java?rev=687388&r1=687387&r2=687388&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java (original) +++ maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java Wed Aug 20 10:19:21 2008 @@ -70,6 +70,12 @@ private final Date startTime; private final boolean showErrors; + + private String makeBehavior; + + private String resumeFrom; + + private List selectedProjects; public DefaultMavenExecutionRequest( ArtifactRepository localRepository, Settings settings, EventDispatcher eventDispatcher, List goals, String baseDirectory, @@ -218,4 +224,35 @@ return config; } + + public String getMakeBehavior() + { + return makeBehavior; + } + + public void setMakeBehavior( String makeBehavior ) + { + this.makeBehavior = makeBehavior; + } + + public String getResumeFrom() + { + return resumeFrom; + } + + public void setResumeFrom( String resumeFrom ) + { + this.resumeFrom = resumeFrom; + } + + public List getSelectedProjects() + { + return selectedProjects; + } + + public void setSelectedProjects( List selectedProjects ) + { + this.selectedProjects = selectedProjects; + } + } Modified: maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java?rev=687388&r1=687387&r2=687388&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java (original) +++ maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java Wed Aug 20 10:19:21 2008 @@ -60,6 +60,18 @@ boolean isReactorActive(); + void setResumeFrom( String resumeFrom ); + + String getResumeFrom(); + + void setSelectedProjects( List projects ); + + List getSelectedProjects(); + + void setMakeBehavior( String makeBehavior ); + + String getMakeBehavior(); + void setPomFile( String pomFile ); String getPomFile(); Modified: maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java?rev=687388&r1=687387&r2=687388&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java (original) +++ maven/components/branches/maven-2.1.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java Wed Aug 20 10:19:21 2008 @@ -24,6 +24,7 @@ import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.apache.maven.project.DuplicateProjectException; import org.apache.maven.project.MavenProject; +import org.apache.maven.project.MissingProjectException; import org.apache.maven.project.ProjectSorter; import org.codehaus.plexus.util.dag.CycleDetectedException; @@ -41,6 +42,13 @@ public static final String FAIL_NEVER = "fail-never"; + public static final String MAKE_MODE = "make"; + + public static final String MAKE_DEPENDENTS_MODE = "make-dependents"; + + // make projects that depend on me, and projects that I depend on + public static final String MAKE_BOTH_MODE = "make-both"; + private List blackList = new ArrayList(); private Map buildFailuresByProject = new HashMap(); @@ -54,10 +62,42 @@ private Map buildSuccessesByProject = new HashMap(); public ReactorManager( List projects ) - throws CycleDetectedException, DuplicateProjectException + throws CycleDetectedException, DuplicateProjectException, MissingProjectException { this.sorter = new ProjectSorter( projects ); } + + public ReactorManager( List projects, List selectedProjects, String resumeFrom, String makeBehavior ) + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + boolean make, makeDependents; + if ( makeBehavior == null ) + { + make = false; + makeDependents = false; + } + else if ( MAKE_MODE.equals( makeBehavior ) ) + { + make = true; + makeDependents = false; + } + else if ( MAKE_DEPENDENTS_MODE.equals( makeBehavior ) ) + { + make = false; + makeDependents = true; + } + else if ( MAKE_BOTH_MODE.equals( makeBehavior ) ) + { + make = true; + makeDependents = true; + } + else + { + throw new IllegalArgumentException( "Invalid make behavior (must be one of: \'" + MAKE_MODE + "\', \'" + + MAKE_DEPENDENTS_MODE + "\', \'" + MAKE_BOTH_MODE + "\')." ); + } + this.sorter = new ProjectSorter( projects, selectedProjects, resumeFrom, make, makeDependents ); + } public Map getPluginContext( PluginDescriptor plugin, MavenProject project ) { @@ -82,6 +122,11 @@ public void setFailureBehavior( String failureBehavior ) { + if ( failureBehavior == null ) + { + this.failureBehavior = FAIL_FAST; // default + return; + } if ( FAIL_FAST.equals( failureBehavior ) || FAIL_AT_END.equals( failureBehavior ) || FAIL_NEVER.equals( failureBehavior ) ) { Modified: maven/components/branches/maven-2.1.x/maven-core/src/test/java/org/apache/maven/plugin/PluginParameterExpressionEvaluatorTest.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-core/src/test/java/org/apache/maven/plugin/PluginParameterExpressionEvaluatorTest.java?rev=687388&r1=687387&r2=687388&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-core/src/test/java/org/apache/maven/plugin/PluginParameterExpressionEvaluatorTest.java (original) +++ maven/components/branches/maven-2.1.x/maven-core/src/test/java/org/apache/maven/plugin/PluginParameterExpressionEvaluatorTest.java Wed Aug 20 10:19:21 2008 @@ -34,6 +34,7 @@ import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.apache.maven.project.DuplicateProjectException; import org.apache.maven.project.MavenProject; +import org.apache.maven.project.MissingProjectException; import org.apache.maven.settings.Settings; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.PlexusTestCase; @@ -201,7 +202,7 @@ } private static MavenSession createSession( PlexusContainer container, ArtifactRepository repo ) - throws CycleDetectedException, DuplicateProjectException + throws CycleDetectedException, DuplicateProjectException, MissingProjectException { return new MavenSession( container, new Settings(), repo, new DefaultEventDispatcher(), new ReactorManager( Collections.EMPTY_LIST ), Collections.EMPTY_LIST, ".", Added: maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/MissingProjectException.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/MissingProjectException.java?rev=687388&view=auto ============================================================================== --- maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/MissingProjectException.java (added) +++ maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/MissingProjectException.java Wed Aug 20 10:19:21 2008 @@ -0,0 +1,41 @@ +package org.apache.maven.project; + + +/* + * 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. + */ + +/** + * Exception that occurs when the user has identifed a project to make, but that project doesn't exist. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Dan Fabulich</a> + * @version $Id: DuplicateProjectException.java 640549 2008-03-24 20:05:11Z bentmann $ + */ +public class MissingProjectException + extends Exception +{ + public MissingProjectException( String message ) + { + super( message ); + } + + public MissingProjectException( String message, Exception e ) + { + super( message, e ); + } +} Modified: maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java?rev=687388&r1=687387&r2=687388&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java (original) +++ maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java Wed Aug 20 10:19:21 2008 @@ -19,6 +19,17 @@ * under the License. */ +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.model.Dependency; import org.apache.maven.model.Extension; @@ -27,13 +38,7 @@ import org.codehaus.plexus.util.dag.CycleDetectedException; import org.codehaus.plexus.util.dag.DAG; import org.codehaus.plexus.util.dag.TopologicalSorter; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import org.codehaus.plexus.util.dag.Vertex; /** * Sort projects by dependencies. @@ -44,6 +49,8 @@ public class ProjectSorter { private final DAG dag; + + private final Map projectMap; private final List sortedProjects; @@ -60,13 +67,20 @@ * <li>do a topo sort on the graph that remains.</li> * </ul> * @throws DuplicateProjectException if any projects are duplicated by id + * @throws MissingProjectException */ public ProjectSorter( List projects ) - throws CycleDetectedException, DuplicateProjectException + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + this( projects, null, null, false, false ); + } + + public ProjectSorter( List projects, List selectedProjectNames, String resumeFrom, boolean make, boolean makeDependents ) + throws CycleDetectedException, DuplicateProjectException, MissingProjectException { dag = new DAG(); - Map projectMap = new HashMap(); + projectMap = new HashMap(); for ( Iterator i = projects.iterator(); i.hasNext(); ) { @@ -167,10 +181,130 @@ sortedProjects.add( projectMap.get( id ) ); } + + // TODO: !![jc; 28-jul-2005] check this; if we're using '-r' and there are aggregator tasks, this will result in weirdness. + for ( Iterator i = sortedProjects.iterator(); i.hasNext() && topLevelProject == null; ) + { + MavenProject project = (MavenProject) i.next(); + if ( project.isExecutionRoot() ) + { + topLevelProject = project; + } + } + + sortedProjects = applyMakeFilter( sortedProjects, dag, projectMap, topLevelProject, selectedProjectNames, make, makeDependents ); + + resumeFrom( resumeFrom, sortedProjects, projectMap, topLevelProject ); this.sortedProjects = Collections.unmodifiableList( sortedProjects ); } + // make selected projects and possibly projects they depend on, or projects that depend on them + private static List applyMakeFilter( List sortedProjects, DAG dag, Map projectMap, MavenProject topLevelProject, List selectedProjectNames, boolean make, boolean makeDependents ) throws MissingProjectException + { + if ( selectedProjectNames == null ) return sortedProjects; + + MavenProject[] selectedProjects = new MavenProject[selectedProjectNames.size()]; + for ( int i = 0; i < selectedProjects.length; i++ ) + { + selectedProjects[i] = findProject( (String) selectedProjectNames.get( i ), projectMap, topLevelProject ); + } + Set projectsToMake = new HashSet( Arrays.asList( selectedProjects ) ); + for ( int i = 0; i < selectedProjects.length; i++ ) + { + MavenProject project = selectedProjects[i]; + String id = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ); + Vertex v = dag.getVertex( id ); + if ( make ) + { + gatherDescendents ( v, projectMap, projectsToMake, new HashSet() ); + } + if ( makeDependents ) + { + gatherAncestors ( v, projectMap, projectsToMake, new HashSet() ); + } + } + for ( Iterator i = sortedProjects.iterator(); i.hasNext(); ) + { + MavenProject project = (MavenProject) i.next(); + if ( !projectsToMake.contains( project ) ) + { + i.remove(); + } + } + return sortedProjects; + } + + private static void resumeFrom( String resumeFrom, List sortedProjects, Map projectMap, MavenProject topLevelProject ) throws MissingProjectException + { + if ( resumeFrom == null ) return; + MavenProject resumeFromProject = findProject( resumeFrom, projectMap, topLevelProject ); + for ( Iterator i = sortedProjects.iterator(); i.hasNext(); ) + { + MavenProject project = (MavenProject) i.next(); + if ( resumeFromProject.equals( project ) ) break; + i.remove(); + } + if ( sortedProjects.isEmpty() ) + { + throw new MissingProjectException( "Couldn't resume, project was not scheduled to run: " + resumeFrom ); + } + } + + private static MavenProject findProject( String projectName, Map projectMap, MavenProject topLevelProject ) throws MissingProjectException + { + MavenProject project = (MavenProject) projectMap.get( projectName ); + if ( project != null ) return project; + // in that case, it must be a file path + File baseDir; + if ( topLevelProject == null ) { + baseDir = new File( System.getProperty( "user.dir" ) ); + } else { + baseDir = topLevelProject.getBasedir(); + // or should this be .getFile().getParentFile() ? + } + + File projectDir = new File( baseDir, projectName ); + if ( !projectDir.exists() ) { + throw new MissingProjectException( "Couldn't find specified project dir: " + projectDir.getAbsolutePath() ); + } + if ( !projectDir.isDirectory() ) { + throw new MissingProjectException( "Couldn't find specified project dir (not a directory): " + projectDir.getAbsolutePath() ); + } + + for ( Iterator i = projectMap.values().iterator(); i.hasNext(); ) + { + project = (MavenProject) i.next(); + if ( projectDir.equals( project.getFile().getParentFile() ) ) return project; + } + + throw new MissingProjectException( "Couldn't find specified project in module list: " + projectDir.getAbsolutePath() ); + } + + private static void gatherDescendents ( Vertex v, Map projectMap, Set out, Set visited ) + { + if ( visited.contains( v ) ) return; + visited.add( v ); + out.add( projectMap.get( v.getLabel() ) ); + for ( Iterator i = v.getChildren().iterator(); i.hasNext(); ) + { + Vertex child = (Vertex) i.next(); + gatherDescendents( child, projectMap, out, visited ); + } + } + + private static void gatherAncestors ( Vertex v, Map projectMap, Set out, Set visited ) + { + if ( visited.contains( v ) ) return; + visited.add( v ); + out.add( projectMap.get( v.getLabel() ) ); + for ( Iterator i = v.getParents().iterator(); i.hasNext(); ) + { + Vertex parent = (Vertex) i.next(); + gatherAncestors( parent, projectMap, out, visited ); + } + } + private void addEdgeWithParentCheck( Map projectMap, String projectRefId, MavenProject project, String id ) throws CycleDetectedException { @@ -195,21 +329,8 @@ } } - // TODO: !![jc; 28-jul-2005] check this; if we're using '-r' and there are aggregator tasks, this will result in weirdness. public MavenProject getTopLevelProject() { - if ( topLevelProject == null ) - { - for ( Iterator i = sortedProjects.iterator(); i.hasNext() && topLevelProject == null; ) - { - MavenProject project = (MavenProject) i.next(); - if ( project.isExecutionRoot() ) - { - topLevelProject = project; - } - } - } - return topLevelProject; } @@ -227,4 +348,14 @@ { return dag.getParentLabels( id ); } + + public DAG getDAG() + { + return dag; + } + + public Map getProjectMap() + { + return projectMap; + } } Modified: maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/ProjectSorterTest.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/ProjectSorterTest.java?rev=687388&r1=687387&r2=687388&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/ProjectSorterTest.java (original) +++ maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/ProjectSorterTest.java Wed Aug 20 10:19:21 2008 @@ -28,6 +28,7 @@ import org.codehaus.plexus.util.dag.CycleDetectedException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -40,9 +41,145 @@ public class ProjectSorterTest extends TestCase { + + public void testBasicSingleProject() + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + MavenProject project = createProject( "group", "artifactA", "1.0" ); + + List projects = new ProjectSorter( Collections.singletonList( project ) ).getSortedProjects(); + + assertEquals( "Wrong number of projects: " + projects, 1, projects.size() ); + assertEquals( "Didn't match project", project, projects.get( 0 ) ); + } + + public void testBasicMultiProject() + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + MavenProject projectA = createProject( "group", "artifactA", "1.0" ); + MavenProject projectB = createProject( "group", "artifactB", "1.0" ); + MavenProject projectC = createProject( "group", "artifactC", "1.0" ); + + projectA.getDependencies().add( createDependency( projectB ) ); + projectB.getDependencies().add( createDependency( projectC ) ); + + List projects = Arrays.asList( new Object[] { projectA, projectB, projectC} ); + + projects = new ProjectSorter( projects ).getSortedProjects(); + + assertEquals( "Wrong number of projects: " + projects, 3, projects.size() ); + assertEquals( "Didn't match project", projectC, projects.get( 0 ) ); + assertEquals( "Didn't match project", projectB, projects.get( 1 ) ); + assertEquals( "Didn't match project", projectA, projects.get( 2 ) ); + } + + public void testResumeFrom() + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + MavenProject projectA = createProject( "group", "artifactA", "1.0" ); + MavenProject projectB = createProject( "group", "artifactB", "1.0" ); + MavenProject projectC = createProject( "group", "artifactC", "1.0" ); + + projectA.getDependencies().add( createDependency( projectB ) ); + projectB.getDependencies().add( createDependency( projectC ) ); + + List projects = Arrays.asList( new Object[] { projectA, projectB, projectC } ); + + projects = new ProjectSorter( projects, null, "group:artifactB", false, false ).getSortedProjects(); + + assertEquals( "Wrong number of projects: " + projects, 2, projects.size() ); + assertEquals( "Didn't match project", projectB, projects.get( 0 ) ); + assertEquals( "Didn't match project", projectA, projects.get( 1 ) ); + } + + public void testSelectedProjects() + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + MavenProject projectA = createProject( "group", "artifactA", "1.0" ); + MavenProject projectB = createProject( "group", "artifactB", "1.0" ); + MavenProject projectC = createProject( "group", "artifactC", "1.0" ); + + projectA.getDependencies().add( createDependency( projectB ) ); + projectB.getDependencies().add( createDependency( projectC ) ); + + List projects = Arrays.asList( new Object[] { projectA, projectB, projectC } ); + List selectedProjects = Arrays.asList( new Object[] { "group:artifactB" } ); + + projects = new ProjectSorter( projects, selectedProjects, null, false, false ).getSortedProjects(); + + assertEquals( "Wrong number of projects: " + projects, 1, projects.size() ); + assertEquals( "Didn't match project", projectB, projects.get( 0 ) ); + } + + public void testMake() + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + MavenProject projectA = createProject( "group", "artifactA", "1.0" ); + MavenProject projectB = createProject( "group", "artifactB", "1.0" ); + MavenProject projectC = createProject( "group", "artifactC", "1.0" ); + + projectA.getDependencies().add( createDependency( projectB ) ); + projectB.getDependencies().add( createDependency( projectC ) ); + + List projects = Arrays.asList( new Object[] { projectA, projectB, projectC } ); + List selectedProjects = Arrays.asList( new Object[] { "group:artifactB" } ); + + projects = new ProjectSorter( projects, selectedProjects, null, true/* make */, false ).getSortedProjects(); + + assertEquals( "Wrong number of projects: " + projects, 2, projects.size() ); + assertEquals( "Didn't match project", projectC, projects.get( 0 ) ); + assertEquals( "Didn't match project", projectB, projects.get( 1 ) ); + } + + public void testMakeDependents() + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + MavenProject projectA = createProject( "group", "artifactA", "1.0" ); + MavenProject projectB = createProject( "group", "artifactB", "1.0" ); + MavenProject projectC = createProject( "group", "artifactC", "1.0" ); + + projectA.getDependencies().add( createDependency( projectB ) ); + projectB.getDependencies().add( createDependency( projectC ) ); + + List projects = Arrays.asList( new Object[] { projectA, projectB, projectC } ); + List selectedProjects = Arrays.asList( new Object[] { "group:artifactB" } ); + + projects = new ProjectSorter( projects, selectedProjects, null, false/* make */, true/*makeDependents*/ ).getSortedProjects(); + + assertEquals( "Wrong number of projects: " + projects, 2, projects.size() ); + assertEquals( "Didn't match project", projectB, projects.get( 0 ) ); + assertEquals( "Didn't match project", projectA, projects.get( 1 ) ); + } + + public void testMakeBoth() + throws CycleDetectedException, DuplicateProjectException, MissingProjectException + { + MavenProject projectA = createProject( "group", "artifactA", "1.0" ); + MavenProject projectB = createProject( "group", "artifactB", "1.0" ); + MavenProject projectC = createProject( "group", "artifactC", "1.0" ); + MavenProject projectD = createProject( "group", "artifactD", "1.0" ); + MavenProject projectE = createProject( "group", "artifactE", "1.0" ); + + projectA.getDependencies().add( createDependency( projectB ) ); + projectB.getDependencies().add( createDependency( projectC ) ); + projectD.getDependencies().add( createDependency( projectE ) ); + projectE.getDependencies().add( createDependency( projectB ) ); + + List projects = Arrays.asList( new Object[] { projectA, projectB, projectC, projectD, projectE } ); + List selectedProjects = Arrays.asList( new Object[] { "group:artifactE" } ); + + projects = + new ProjectSorter( projects, selectedProjects, null, true/* make */, true/* makeDependents */).getSortedProjects(); + + assertEquals( "Wrong number of projects: " + projects, 4, projects.size() ); + assertEquals( "Didn't match project", projectC, projects.get( 0 ) ); + assertEquals( "Didn't match project", projectB, projects.get( 1 ) ); + assertEquals( "Didn't match project", projectE, projects.get( 2 ) ); + assertEquals( "Didn't match project", projectD, projects.get( 3 ) ); + } public void testShouldNotFailWhenProjectReferencesNonExistentProject() - throws CycleDetectedException, DuplicateProjectException + throws CycleDetectedException, DuplicateProjectException, MissingProjectException { MavenProject project = createProject( "group", "artifact", "1.0" ); Model model = project.getModel(); @@ -67,7 +204,7 @@ } public void testMatchingArtifactIdsDifferentGroupIds() - throws CycleDetectedException, DuplicateProjectException + throws CycleDetectedException, DuplicateProjectException, MissingProjectException { List projects = new ArrayList(); MavenProject project1 = createProject( "groupId1", "artifactId", "1.0" ); @@ -83,7 +220,7 @@ } public void testMatchingGroupIdsDifferentArtifactIds() - throws CycleDetectedException, DuplicateProjectException + throws CycleDetectedException, DuplicateProjectException, MissingProjectException { List projects = new ArrayList(); MavenProject project1 = createProject( "groupId", "artifactId1", "1.0" ); @@ -99,7 +236,7 @@ } public void testMatchingIdsAndVersions() - throws CycleDetectedException + throws CycleDetectedException, MissingProjectException { List projects = new ArrayList(); MavenProject project1 = createProject( "groupId", "artifactId", "1.0" ); @@ -120,7 +257,7 @@ } public void testMatchingIdsAndDifferentVersions() - throws CycleDetectedException + throws CycleDetectedException, MissingProjectException { List projects = new ArrayList(); MavenProject project1 = createProject( "groupId", "artifactId", "1.0" );