Return-Path: Delivered-To: apmail-maven-commits-archive@www.apache.org Received: (qmail 62478 invoked from network); 5 Apr 2008 02:19:55 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 5 Apr 2008 02:19:55 -0000 Received: (qmail 9729 invoked by uid 500); 5 Apr 2008 02:19:55 -0000 Delivered-To: apmail-maven-commits-archive@maven.apache.org Received: (qmail 9665 invoked by uid 500); 5 Apr 2008 02:19:54 -0000 Mailing-List: contact commits-help@maven.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@maven.apache.org Delivered-To: mailing list commits@maven.apache.org Received: (qmail 9652 invoked by uid 99); 5 Apr 2008 02:19:54 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 04 Apr 2008 19:19:54 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 05 Apr 2008 02:19:20 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 0D6771A9832; Fri, 4 Apr 2008 19:19:33 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r645015 - in /maven/components/trunk: maven-core/src/main/aspect/org/apache/maven/errors/ maven-core/src/main/java/org/apache/maven/lifecycle/ maven-core/src/main/java/org/apache/maven/lifecycle/binding/ maven-core/src/main/java/org/apache/... Date: Sat, 05 Apr 2008 02:19:31 -0000 To: commits@maven.apache.org From: jdcasey@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080405021933.0D6771A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jdcasey Date: Fri Apr 4 19:19:29 2008 New Revision: 645015 URL: http://svn.apache.org/viewvc?rev=645015&view=rev Log: Fixing unit test problems from it0103 fix, and fixing it0042...just 4 more failing ITs before this is back on its feet. Modified: maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java maven/components/trunk/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java maven/components/trunk/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/workspace/ModelAndFileCachingTest.java Modified: maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj (original) +++ maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj Fri Apr 4 19:19:29 2008 @@ -295,8 +295,8 @@ MavenSession session ) throws LifecycleLoaderException, LifecycleSpecificationException, LifecyclePlannerException: cflow( execution( * DefaultLifecycleExecutor.*( .. ) ) ) - && execution( BuildPlan BuildPlanner+.constructBuildPlan( List, MavenProject, MavenSession ) ) - && args( tasks, project, session ) + && execution( BuildPlan BuildPlanner+.constructBuildPlan( List, MavenProject, MavenSession, * ) ) + && args( tasks, project, session, * ) { try { Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Fri Apr 4 19:19:29 2008 @@ -177,7 +177,7 @@ if ( segment.aggregate() ) { - executeTaskSegmentsForProject( segment, rootProject, reactorManager, dispatcher, session ); + executeTaskSegmentForProject( segment, rootProject, reactorManager, dispatcher, session ); } else { @@ -188,13 +188,13 @@ { MavenProject currentProject = (MavenProject) projectIterator.next(); - executeTaskSegmentsForProject( segment, currentProject, reactorManager, dispatcher, session ); + executeTaskSegmentForProject( segment, currentProject, reactorManager, dispatcher, session ); } } } } - private void executeTaskSegmentsForProject( TaskSegment segment, + private void executeTaskSegmentForProject( TaskSegment segment, MavenProject project, ReactorManager reactorManager, EventDispatcher dispatcher, @@ -397,10 +397,7 @@ List mojoBindings; try { - BuildPlan plan = buildPlanner.constructBuildPlan( - tasks, - project, - session ); + BuildPlan plan = buildPlanner.constructBuildPlan( tasks, project, session, false ); if ( getLogger().isDebugEnabled() ) { Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java Fri Apr 4 19:19:29 2008 @@ -37,6 +37,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.StringTokenizer; /** @@ -72,8 +73,7 @@ private PlexusContainer container; /** - * Retrieve the LifecycleBindings given by the lifecycle mapping component/file for the project's packaging. Any - * applicable mojo configuration will be injected into the LifecycleBindings from the POM. + * {@inheritDoc} */ public LifecycleBindings getBindingsForPackaging( final MavenProject project, final MavenSession session ) throws LifecycleLoaderException, LifecycleSpecificationException @@ -123,8 +123,7 @@ } /** - * Construct the LifecycleBindings for the default lifecycle mappings, including injection of configuration from the - * project into each MojoBinding, where appropriate. + * {@inheritDoc} */ public LifecycleBindings getDefaultBindings( final MavenProject project ) throws LifecycleSpecificationException { @@ -141,10 +140,9 @@ } /** - * Construct the LifecycleBindings that constitute the extra mojos bound to the lifecycle within the POM itself. - * @param session + * {@inheritDoc} */ - public LifecycleBindings getProjectCustomBindings( final MavenProject project, final MavenSession session ) + public LifecycleBindings getProjectCustomBindings( final MavenProject project, final MavenSession session, Set unbindableMojos ) throws LifecycleLoaderException, LifecycleSpecificationException { LifecycleBindings bindings = new LifecycleBindings(); @@ -210,7 +208,7 @@ } catch ( PluginLoaderException e ) { - mojoBinding.setLateBound( true ); + unbindableMojos.add( mojoBinding ); String message = "Failed to load plugin descriptor for: " + plugin @@ -236,6 +234,8 @@ { logger.error( "Somehow, the PluginDescriptor for plugin: " + plugin.getKey() + " contains no mojos. This is highly irregular. Ignoring..." ); + + unbindableMojos.add( mojoBinding ); continue; } @@ -267,14 +267,15 @@ } else { - logger.debug( "Skipping addition to build-plan for goal: " + logger.warn( "\n\nSkipping addition to build-plan for goal: " + goal + " in execution: " + execution.getId() + " of plugin: " + plugin.getKey() - + " because no phase information was available (either through the mojo descriptor, which is currently missing, or in the POM itself)." ); + + " because no phase information was available (either through the mojo descriptor, which is currently missing, or in the POM itself).\n\n" ); + unbindableMojos.add( mojoBinding ); continue; } } @@ -294,8 +295,7 @@ } /** - * Construct the LifecycleBindings that constitute the mojos mapped to the lifecycles by an overlay specified in a - * plugin. Inject mojo configuration from the POM into all appropriate MojoBinding instances. + * {@inheritDoc} */ public LifecycleBindings getPluginLifecycleOverlay( final PluginDescriptor pluginDescriptor, final String lifecycleId, final MavenProject project ) @@ -417,15 +417,7 @@ } /** - * Retrieve the list of MojoBinding instances that correspond to the reports configured for the specified project. - * Inject all appropriate configuration from the POM for each MojoBinding, using the following precedence rules: - *
- *
    - *
  1. report-set-level configuration
  2. - *
  3. reporting-level configuration
  4. - *
  5. execution-level configuration
  6. - *
  7. plugin-level configuration
  8. - *
+ * {@inheritDoc} */ public List getReportBindings( final MavenProject project, final MavenSession session ) throws LifecycleLoaderException, LifecycleSpecificationException @@ -599,6 +591,51 @@ throws ContextException { container = (PlexusContainer) ctx.get( PlexusConstants.PLEXUS_KEY ); + } + + /** + * {@inheritDoc} + */ + public void resolveUnbindableMojos( final Set unbindableMojos, + final MavenProject project, + final MavenSession session, + final LifecycleBindings lifecycleBindings ) + throws LifecycleSpecificationException + { + for ( Iterator it = unbindableMojos.iterator(); it.hasNext(); ) + { + MojoBinding binding = (MojoBinding) it.next(); + PluginDescriptor pluginDescriptor; + try + { + pluginDescriptor = pluginLoader.loadPlugin( binding, project, session ); + } + catch ( PluginLoaderException e ) + { + String message = "Failed to load plugin descriptor for: " + + MojoBindingUtils.toString( binding ) + + ". Cannot discover it's default phase, specified in its plugin descriptor."; + + throw new LifecycleSpecificationException( message, e ); + } + + MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( binding.getGoal() ); + if ( mojoDescriptor == null ) + { + throw new LifecycleSpecificationException( "Cannot find mojo descriptor for goal: " + binding.getGoal() + " in plugin: " + pluginDescriptor.getPluginLookupKey() ); + } + + String phase = mojoDescriptor.getPhase(); + if ( phase == null ) + { + throw new LifecycleSpecificationException( + "Mojo descriptor: " + + mojoDescriptor.getFullGoalName() + + " doesn't have a default lifecycle phase. Please specify a for this goal in your POM." ); + } + + LifecycleUtils.addMojoBinding( phase, binding, lifecycleBindings ); + } } } Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java Fri Apr 4 19:19:29 2008 @@ -4,10 +4,13 @@ import org.apache.maven.lifecycle.LifecycleLoaderException; import org.apache.maven.lifecycle.LifecycleSpecificationException; import org.apache.maven.lifecycle.model.LifecycleBindings; +import org.apache.maven.lifecycle.model.MojoBinding; +import org.apache.maven.plugin.descriptor.MojoDescriptor; import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.apache.maven.project.MavenProject; import java.util.List; +import java.util.Set; /** * Responsible for the gross construction of LifecycleBindings, or mappings of MojoBinding instances to different parts @@ -39,7 +42,7 @@ /** * Construct the LifecycleBindings that constitute the extra mojos bound to the lifecycle within the POM itself. */ - LifecycleBindings getProjectCustomBindings( MavenProject project, MavenSession session ) + LifecycleBindings getProjectCustomBindings( MavenProject project, MavenSession session, Set unresolvableBindings ) throws LifecycleLoaderException, LifecycleSpecificationException; /** @@ -62,5 +65,21 @@ * */ List getReportBindings( MavenProject project, MavenSession session ) throws LifecycleLoaderException, LifecycleSpecificationException; + + /** + * Go through the set of unbindable mojos provided (these are {@link MojoBinding} instancess coming + * from the project as custom bindings for which we failed to determine a phase + * to bind them during {@link LifecycleBindingManager#getProjectCustomBindings(MavenProject, MavenSession, Set)}). + * For each {@link MojoBinding}, attempt to resolve it again, and if successful, + * extract the default phase name from the {@link MojoDescriptor}. + * + * @throws LifecycleSpecificationException In case the plugin cannot be resolved, the plugin doesn't contain the specified mojo, + * or the mojo doesn't have a default phase. + */ + void resolveUnbindableMojos( final Set unbindableMojos, + final MavenProject project, + final MavenSession session, + final LifecycleBindings lifecycleBindings ) + throws LifecycleSpecificationException; } Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java Fri Apr 4 19:19:29 2008 @@ -38,17 +38,20 @@ private boolean includingReports = false; + private Set unbindableMojos; + public BuildPlan( final LifecycleBindings packaging, final LifecycleBindings projectBindings, - final LifecycleBindings defaults, final List tasks ) + final LifecycleBindings defaults, final Set unbindableMojos, final List tasks ) throws LifecycleSpecificationException, LifecycleLoaderException { - this( LifecycleUtils.mergeBindings( packaging, projectBindings, defaults, true, false ), tasks ); + this( LifecycleUtils.mergeBindings( packaging, projectBindings, defaults, true, false ), unbindableMojos, tasks ); } - public BuildPlan( final LifecycleBindings bindings, final List tasks ) + public BuildPlan( final LifecycleBindings bindings, final Set unbindableMojos, final List tasks ) throws LifecycleSpecificationException, LifecycleLoaderException { this.bindings = bindings; + this.unbindableMojos = unbindableMojos == null ? null : new HashSet( unbindableMojos ); this.tasks = tasks; forkedDirectInvocations = new HashMap(); forkedPhases = new HashMap(); @@ -56,9 +59,10 @@ } private BuildPlan( final LifecycleBindings bindings, final Map forkedDirectInvocations, final Map forkedPhases, - final Map directInvocationBindings, final Set fullyResolvedMojoBindings, final List tasks, - boolean includingReports ) + final Map directInvocationBindings, final Set fullyResolvedMojoBindings, final Set unbindableMojos, + final List tasks, boolean includingReports ) { + this.unbindableMojos = unbindableMojos == null ? null : new HashSet( unbindableMojos ); this.bindings = LifecycleUtils.cloneBindings( bindings ); this.forkedDirectInvocations = new HashMap( forkedDirectInvocations ); this.forkedPhases = new HashMap( forkedPhases ); @@ -78,6 +82,26 @@ return includingReports; } + public boolean hasUnbindableMojos() + { + return unbindableMojos != null && !unbindableMojos.isEmpty(); + } + + public Set getUnbindableMojos() + { + return unbindableMojos; + } + + public void clearUnbindableMojos() + { + unbindableMojos = null; + } + + public void addUnbindableMojo( MojoBinding binding ) + { + unbindableMojos.add( binding ); + } + public boolean isFullyResolved( final MojoBinding mojoBinding ) { String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false ); @@ -176,7 +200,7 @@ public BuildPlan copy( final List newTasks ) { - return new BuildPlan( bindings, forkedDirectInvocations, forkedPhases, directInvocationBindings, fullyResolvedBindings, newTasks, includingReports ); + return new BuildPlan( bindings, forkedDirectInvocations, forkedPhases, directInvocationBindings, fullyResolvedBindings, unbindableMojos, newTasks, includingReports ); } public void resetExecutionProgress() @@ -227,7 +251,6 @@ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false ); if ( !executionStack.contains( key ) ) { - addResolverIfLateBound( mojoBinding, plan ); plan.addAll( findForkedBindings( mojoBinding, executionStack ) ); } } @@ -238,7 +261,6 @@ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false ); if ( !executionStack.contains( key ) ) { - addResolverIfLateBound( mojoBinding, plan ); plan.addAll( findForkedBindings( mojoBinding, executionStack ) ); } } @@ -247,15 +269,6 @@ return plan; } - private void addResolverIfLateBound( final MojoBinding mojoBinding, final List plan ) - { - if ( mojoBinding.isLateBound() ) - { - MojoBinding resolveBinding = StateManagementUtils.createResolveLateBoundMojoBinding( mojoBinding ); - plan.add( resolveBinding ); - } - } - private List findForkedBindings( final MojoBinding mojoBinding, final Stack executionStack ) throws NoSuchPhaseException { @@ -294,7 +307,6 @@ continue; } - addResolverIfLateBound( invocation, forkedBindings ); forkedBindings.addAll( findForkedBindings( invocation, executionStack ) ); } } Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java Fri Apr 4 19:19:29 2008 @@ -24,7 +24,8 @@ */ BuildPlan constructBuildPlan( List tasks, MavenProject project, - MavenSession session ) + MavenSession session, + boolean allowUnbindableMojos ) throws LifecycleLoaderException, LifecycleSpecificationException, LifecyclePlannerException; void constructInitialProjectBuildPlans( MavenSession session ) Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java (original) +++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java Fri Apr 4 19:19:29 2008 @@ -18,9 +18,11 @@ import org.codehaus.plexus.logging.Logger; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Set; import java.util.Stack; /** @@ -62,7 +64,7 @@ BuildPlan plan = session.getBuildPlan( project ); if ( plan == null ) { - plan = constructBuildPlan( Collections.EMPTY_LIST, project, session ); + plan = constructBuildPlan( Collections.EMPTY_LIST, project, session, true ); session.setBuildPlan( project, plan ); } @@ -73,13 +75,15 @@ /** * Orchestrates construction of the build plan which will be used by the user of LifecycleExecutor. */ - public BuildPlan constructBuildPlan( final List tasks, - final MavenProject project, - final MavenSession session ) + public BuildPlan constructBuildPlan( List tasks, + MavenProject project, + MavenSession session, + boolean allowUnbindableMojos ) throws LifecycleLoaderException, LifecycleSpecificationException, LifecyclePlannerException { BuildPlan plan = session.getBuildPlan( project ); + boolean pluginResolutionAttempted = false; if ( plan != null ) { plan = plan.copy( tasks ); @@ -87,20 +91,31 @@ else { LifecycleBindings defaultBindings = lifecycleBindingManager.getDefaultBindings( project ); + LifecycleBindings packagingBindings = lifecycleBindingManager.getBindingsForPackaging( project, session ); + + Set unbindableMojos = new HashSet(); LifecycleBindings projectBindings = lifecycleBindingManager.getProjectCustomBindings( project, - session ); + session, + unbindableMojos ); + + plan = new BuildPlan( packagingBindings, projectBindings, defaultBindings, unbindableMojos, tasks ); + pluginResolutionAttempted = true; + } - plan = new BuildPlan( packagingBindings, projectBindings, defaultBindings, tasks ); + if ( ( !pluginResolutionAttempted || !allowUnbindableMojos ) && plan.hasUnbindableMojos() ) + { + lifecycleBindingManager.resolveUnbindableMojos( plan.getUnbindableMojos(), project, session, plan.getLifecycleBindings() ); + plan.clearUnbindableMojos(); } // initialize/resolve any direct-invocation tasks, if possible. initializeDirectInvocations( plan, project, session ); // Inject forked lifecycles as plan modifiers for each mojo that has @execute in it. - addForkedLifecycleModifiers( plan, project, session, new LinkedList() ); - addReportingLifecycleModifiers( plan, project, session, new LinkedList() ); + addForkedLifecycleModifiers( plan, project, session, new LinkedList(), allowUnbindableMojos ); + addReportingLifecycleModifiers( plan, project, session, new LinkedList(), allowUnbindableMojos ); plan.markFullyResolved(); @@ -147,8 +162,9 @@ */ private void addForkedLifecycleModifiers( final BuildPlan plan, final MavenProject project, - MavenSession session, - LinkedList callStack ) + final MavenSession session, + LinkedList callStack, + final boolean allowUnbindableMojos ) throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException { List planBindings = plan.renderExecutionPlan( new Stack() ); @@ -160,7 +176,7 @@ if ( !plan.isFullyResolved( mojoBinding ) ) { - findForkModifiers( mojoBinding, plan, project, session, callStack ); + findForkModifiers( mojoBinding, plan, project, session, callStack, allowUnbindableMojos ); } } } @@ -169,13 +185,15 @@ final BuildPlan plan, final MavenProject project, MavenSession session, - LinkedList callStack ) + LinkedList callStack, + final boolean allowUnbindableMojos ) throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException { PluginDescriptor pluginDescriptor = loadPluginDescriptor( mojoBinding, plan, project, - session ); + session, + allowUnbindableMojos ); if ( pluginDescriptor == null ) { @@ -190,20 +208,19 @@ + pluginDescriptor.getId() + "." ); } - findForkModifiers( mojoBinding, pluginDescriptor, plan, project, session, false, callStack ); + findForkModifiers( mojoBinding, pluginDescriptor, plan, project, session, callStack, false, allowUnbindableMojos ); } /** * Traverses all MojoBinding instances discovered from the POM and its packaging-mappings, and orchestrates the * process of injecting any modifiers that are necessary to accommodate mojos that require access to the project's * configured reports. - * @param callStack - * @param session */ private void addReportingLifecycleModifiers( final BuildPlan plan, final MavenProject project, - MavenSession session, - LinkedList callStack ) + final MavenSession session, + LinkedList callStack, + final boolean allowUnbindableMojos ) throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException { if ( plan.isIncludingReports() ) @@ -228,7 +245,8 @@ PluginDescriptor pluginDescriptor = loadPluginDescriptor( mojoBinding, plan, project, - session ); + session, + allowUnbindableMojos ); if ( pluginDescriptor == null ) { @@ -265,7 +283,8 @@ PluginDescriptor pd = loadPluginDescriptor( reportBinding, plan, project, - session ); + session, + allowUnbindableMojos ); if ( pd != null ) { @@ -274,8 +293,9 @@ plan, project, session, + callStack, true, - callStack ); + allowUnbindableMojos ); } } } @@ -292,7 +312,9 @@ private PluginDescriptor loadPluginDescriptor( final MojoBinding mojoBinding, final BuildPlan plan, final MavenProject project, - final MavenSession session ) + final MavenSession session, + final boolean allowUnbindableMojos ) + throws LifecyclePlannerException { PluginDescriptor pluginDescriptor = null; try @@ -301,20 +323,27 @@ } catch ( PluginLoaderException e ) { - String message = "Failed to load plugin: " - + MojoBindingUtils.createPluginKey( mojoBinding ) - + ". Adding to late-bound plugins list.\nReason: " + e.getMessage(); - - if ( logger.isDebugEnabled() ) + if ( allowUnbindableMojos ) { - logger.debug( message, e ); + String message = "Failed to load plugin: " + + MojoBindingUtils.createPluginKey( mojoBinding ) + + ". Adding to late-bound plugins list.\nReason: " + e.getMessage(); + + if ( logger.isDebugEnabled() ) + { + logger.debug( message, e ); + } + else + { + logger.warn( message ); + } + + plan.addUnbindableMojo( mojoBinding ); } else { - logger.warn( message ); + throw new LifecyclePlannerException( "Failed to resolve plugin for mojo binding: " + MojoBindingUtils.toString( mojoBinding ), e ); } - - mojoBinding.setLateBound( true ); } return pluginDescriptor; @@ -330,8 +359,9 @@ final BuildPlan plan, final MavenProject project, final MavenSession session, + LinkedList callStack, final boolean includeReportConfig, - LinkedList callStack ) + final boolean allowUnbindableMojos ) throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException { String referencingGoal = mojoBinding.getGoal(); @@ -360,8 +390,9 @@ plan, project, session, + callStack, includeReportConfig, - callStack ); + allowUnbindableMojos ); } } @@ -380,8 +411,9 @@ final BuildPlan plan, final MavenProject project, final MavenSession session, + LinkedList callStack, final boolean includeReportConfig, - LinkedList callStack ) + final boolean allowUnbindableMojos ) throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException { callStack.addFirst( mojoBinding ); @@ -429,7 +461,7 @@ plan.addForkedExecution( mojoBinding, clonedPlan ); - addForkedLifecycleModifiers( clonedPlan, project, session, callStack ); + addForkedLifecycleModifiers( clonedPlan, project, session, callStack, allowUnbindableMojos ); } finally { Modified: maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java (original) +++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java Fri Apr 4 19:19:29 2008 @@ -28,6 +28,7 @@ import java.io.File; import java.net.URL; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -203,7 +204,7 @@ MavenProject project = new MavenProject( model ); - LifecycleBindings lifecycleBindings = mgr.getProjectCustomBindings( project, null ); + LifecycleBindings lifecycleBindings = mgr.getProjectCustomBindings( project, null, new HashSet() ); List bindings = lifecycleBindings.getBuildBinding().getValidate().getBindings(); Modified: maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java (original) +++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java Fri Apr 4 19:19:29 2008 @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Stack; @@ -64,11 +65,12 @@ check.add( StateManagementUtils.createClearForkedExecutionMojoBinding() ); - BuildPlan plan = new BuildPlan( new LifecycleBindings(), tasks ); + BuildPlan plan = new BuildPlan( new LifecycleBindings(), new HashSet(), tasks ); plan.addDirectInvocationBinding( "eclipse:eclipse", eclipseBinding ); plan.addForkedExecution( eclipseBinding, new BuildPlan( bindings, + new HashSet(), Collections.singletonList( "generate-sources" ) ) ); List executionPlan = plan.renderExecutionPlan( new Stack() ); @@ -120,7 +122,7 @@ List tasks = Collections.singletonList( "package" ); - BuildPlan plan = new BuildPlan( bindings, tasks ); + BuildPlan plan = new BuildPlan( bindings, new HashSet(), tasks ); plan.addForkedExecution( assemblyBinding, plan.copy( "package" ) ); Modified: maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java (original) +++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java Fri Apr 4 19:19:29 2008 @@ -88,7 +88,8 @@ BuildPlan plan = buildPlanner.constructBuildPlan( Collections.singletonList( "package" ), project, - session ); + session, + false ); List rendered = plan.renderExecutionPlan( new Stack() ); @@ -154,7 +155,8 @@ BuildPlan plan = buildPlanner.constructBuildPlan( Collections.singletonList( "deploy" ), project, - session ); + session, + false ); List rendered = plan.renderExecutionPlan( new Stack() ); Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java (original) +++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java Fri Apr 4 19:19:29 2008 @@ -533,6 +533,14 @@ MavenProject project ) throws MavenEmbedderException { + return getBuildPlan( goals, project, false ); + } + + public BuildPlan getBuildPlan( List goals, + MavenProject project, + boolean allowUnbindableMojos ) + throws MavenEmbedderException + { MavenExecutionRequest req = new DefaultMavenExecutionRequest( request ); req.setGoals( goals ); @@ -559,7 +567,7 @@ try { - return buildPlanner.constructBuildPlan( goals, project, session ); + return buildPlanner.constructBuildPlan( goals, project, session, allowUnbindableMojos ); } catch ( LifecycleException e ) { Modified: maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java (original) +++ maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java Fri Apr 4 19:19:29 2008 @@ -152,12 +152,6 @@ return method; } - private File prepareProjectDir() - throws IOException - { - return prepareProjectDir( "nothing" ); - } - private File prepareProjectDir( String basename ) throws IOException { @@ -494,7 +488,7 @@ .setShowErrors( true ) .setErrorReporter( reporter ) .setGoals( Arrays.asList( new String[] { - "initialize" + "org.apache.maven.errortest:err-loading-plugin-maven-plugin:1:test" } ) ); maven.execute( request ); @@ -1355,31 +1349,36 @@ reporterCtl.verify(); } - public void testReportInvalidRepositoryWhileGettingRepositoriesFromProfiles() - throws IOException - { - File projectDir = prepareProjectDir( "bad-profile-repo" ); - - reporter.reportInvalidRepositoryWhileGettingRepositoriesFromProfiles( null, - null, - null, - null ); - reporterCtl.setMatcher( MockControl.ALWAYS_MATCHER ); - reporterCtl.setVoidCallable(); - - reporterCtl.replay(); - - MavenExecutionRequest request = new DefaultMavenExecutionRequest().setBaseDirectory( projectDir ) - .setShowErrors( true ) - .setErrorReporter( reporter ) - .setGoals( Arrays.asList( new String[] { - "initialize" - } ) ); - - maven.execute( request ); - - reporterCtl.verify(); - } + // FIXME: Something keeps flip-flopping about this test, between the two reporter methods below...need to revisit this pronto. +// public void testReportErrorCreatingArtifactRepository_fromProfilesXml() +// throws IOException +// { +// File projectDir = prepareProjectDir( "bad-profile-repo" ); +// +// reporter.reportInvalidRepositoryWhileGettingRepositoriesFromProfiles( null, null, null, null ); +// reporterCtl.setMatcher( MockControl.ALWAYS_MATCHER ); +//// reporterCtl.setVoidCallable( MockControl.ZERO_OR_MORE ); +// +//// reporter.reportErrorCreatingArtifactRepository( null, null, null, null ); +//// reporterCtl.setMatcher( MockControl.ALWAYS_MATCHER ); +// reporterCtl.setVoidCallable(); +// +// reporterCtl.replay(); +// +// MavenExecutionRequest request = new DefaultMavenExecutionRequest().setBaseDirectory( projectDir ) +// .setLoggingLevel( Logger.LEVEL_DEBUG ) +// .setShowErrors( true ) +// .setErrorReporter( reporter ) +// .setGoals( Arrays.asList( new String[] { +// "initialize" +// } ) ); +// +// MavenExecutionResult result = maven.execute( request ); +// +// reportExceptions( result, projectDir, false ); +// +// reporterCtl.verify(); +// } public void testReportParentPomArtifactNotFound() throws IOException Modified: maven/components/trunk/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java (original) +++ maven/components/trunk/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java Fri Apr 4 19:19:29 2008 @@ -200,6 +200,7 @@ Phase phase = (Phase) phases.get( idx ); phase.addBinding( mojoBinding ); + mojoBinding.setLifecycleInfo( phase ); } public static void addMojoBinding( final String phaseName, final MojoBinding mojo, final LifecycleBindings bindings ) Modified: maven/components/trunk/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo (original) +++ maven/components/trunk/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo Fri Apr 4 19:19:29 2008 @@ -678,25 +678,6 @@ this.originDescription = originDescription; } - private boolean lateBound = false; - - /** - * Mark this mojo binding as late-bound, meaning the plugin for this mojo - * could not be resolved when it was included in a build plan (the class - * responsible for calculating the ordered list of mojos to execute for a build). - * This flag should result in Maven injecting an internal step into the build - * just ahead of this mojo's execution, to resolve the plugin it refers to. - */ - public boolean isLateBound() - { - return lateBound; - } - - public void setLateBound( boolean lateBound ) - { - this.lateBound = lateBound; - } - private Phase phase; /** Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java (original) +++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java Fri Apr 4 19:19:29 2008 @@ -367,6 +367,7 @@ result = projectWorkspace.getModelAndFile( parentPomFile ); if ( result != null && !parentModelMatches( modelParent, result.getModel() ) ) { + parentPomFile = null; result = null; } } @@ -386,10 +387,17 @@ getLogger().debug( "Allowing parent-model resolution to proceed for: " + key + " (child is: " + model.getId() + ")" ); - if ( parentPomFile != null && parentPomFile.exists() ) + if ( parentPomFile != null ) { - Model parentModel = readModel( parentPomFile ); - if ( !parentModelMatches( modelParent, parentModel ) ) + if ( parentPomFile.exists() ) + { + Model parentModel = readModel( parentPomFile ); + if ( !parentModelMatches( modelParent, parentModel ) ) + { + parentPomFile = null; + } + } + else { parentPomFile = null; } @@ -480,7 +488,7 @@ boolean versionsMatch = ( parentModel.getVersion() == null ) || parentModel.getVersion().equals( modelParent.getVersion() ); - if ( groupsMatch && !versionsMatch + if ( groupsMatch && versionsMatch && parentModel.getArtifactId().equals( modelParent.getArtifactId() ) ) { return true; Modified: maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/workspace/ModelAndFileCachingTest.java URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/workspace/ModelAndFileCachingTest.java?rev=645015&r1=645014&r2=645015&view=diff ============================================================================== --- maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/workspace/ModelAndFileCachingTest.java (original) +++ maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/workspace/ModelAndFileCachingTest.java Fri Apr 4 19:19:29 2008 @@ -136,7 +136,7 @@ new DefaultProjectBuilderConfiguration().setLocalRepository( localRepo ).setGlobalProfileManager( profileManager ), Collections.EMPTY_LIST, false, - false ); + true ); assertEquals( parentPomFile.getCanonicalPath(), lineage.getDeepestAncestorFile() .getCanonicalPath() );