Index: src/test/java/org/apache/maven/werkz/GoalTest.java =================================================================== --- src/test/java/org/apache/maven/werkz/GoalTest.java (revision 170449) +++ src/test/java/org/apache/maven/werkz/GoalTest.java (working copy) @@ -21,6 +21,8 @@ import java.util.List; +import org.apache.maven.jelly.MavenJellyContext; + public class GoalTest extends TestCase { private Session session; @@ -33,6 +35,7 @@ public void setUp() { this.session = new Session(); + this.session.setContext( new MavenJellyContext() ); } public void tearDown() Index: src/test/java/org/apache/maven/werkz/ProjectTest.java =================================================================== --- src/test/java/org/apache/maven/werkz/ProjectTest.java (revision 170449) +++ src/test/java/org/apache/maven/werkz/ProjectTest.java (working copy) @@ -21,6 +21,8 @@ import java.util.Arrays; +import org.apache.maven.jelly.MavenJellyContext; + public class ProjectTest extends TestCase { private Session session; @@ -33,6 +35,7 @@ public void setUp() { this.session = new Session(); + this.session.setContext( new MavenJellyContext() ); } public void tearDown() Index: src/java/org/apache/maven/jelly/MavenJellyContext.java =================================================================== --- src/java/org/apache/maven/jelly/MavenJellyContext.java (revision 170449) +++ src/java/org/apache/maven/jelly/MavenJellyContext.java (working copy) @@ -28,11 +28,14 @@ import org.apache.maven.MavenSession; import org.apache.maven.jelly.tags.jeez.MavenJeezTagLibrary; import org.apache.maven.project.Project; +import org.apache.maven.werkz.Goal; +import org.apache.maven.werkz.Session; import org.apache.maven.werkz.WerkzProject; import java.io.File; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -725,5 +728,14 @@ setVariable( var, f.getAbsolutePath() ); } } + + private HashMap attainedGoals = new HashMap(); + public synchronized boolean wasAttained(Goal goal) { + return this.attainedGoals.containsKey(goal); + } + + public synchronized void setAttained(Goal goal, Session session) { + this.attainedGoals.put( goal, session ); + } } Index: src/java/org/apache/maven/jelly/tags/werkz/MavenAttainGoalTag.java =================================================================== --- src/java/org/apache/maven/jelly/tags/werkz/MavenAttainGoalTag.java (revision 170449) +++ src/java/org/apache/maven/jelly/tags/werkz/MavenAttainGoalTag.java (working copy) @@ -100,6 +100,7 @@ MavenJellyContext baseContext = (MavenJellyContext) session.getAttribute( PluginManager.BASE_CONTEXT ); GoalToJellyScriptHousingMapper mapper = (GoalToJellyScriptHousingMapper) session.getAttribute( PluginManager.GOAL_MAPPER ); + session.setContext( baseContext ); PluginManager pluginManager = (PluginManager) session.getAttribute( PluginManager.PLUGIN_MANAGER ); Set pluginSet; Index: src/java/org/apache/maven/plugin/PluginManager.java =================================================================== --- src/java/org/apache/maven/plugin/PluginManager.java (revision 170449) +++ src/java/org/apache/maven/plugin/PluginManager.java (working copy) @@ -684,6 +684,9 @@ { throw new NoSuchGoalException( goalName ); } + if ( session.getContext() == null ) { + session.setContext( baseContext ); + } goal.attain( session ); } catch ( NoSuchGoalException e ) Index: src/java/org/apache/maven/werkz/Goal.java =================================================================== --- src/java/org/apache/maven/werkz/Goal.java (revision 170449) +++ src/java/org/apache/maven/werkz/Goal.java (working copy) @@ -72,6 +72,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.maven.jelly.MavenJellyContext; /** Abstract Goal to attain. * @@ -571,6 +572,7 @@ /** Attempt to attain this Goal. * * @param session The context in which to attain goals. + * @param baseContext * * @throws UnattainableGoalException if unable to attain this Goal * or one of its precursor Goals. @@ -578,18 +580,29 @@ */ public final void attain(Session session) throws UnattainableGoalException, NoActionDefinitionException { - if ( session.isGoalSatisfied( this ) ) - { - // session.info( getName() + ":" ); - // session.info( "" ); - return; - } - - // session.info( getName() + ": checking precursors." ); - - attainPrecursors( session ); - - fire(session); +// System.out.println( "### ATTAIN " + getName() + " on Session " + session.hashCode() + ": " + session.isGoalSatisfied(this) ); + MavenJellyContext context = session.getContext(); +// System.out.println( "## Goal: "+ this + " Context: " + context ); + if ( context == null ) { + throw new RuntimeException( "session has no context" ); + } + if ( context.wasAttained(this) ) { + System.out.println("##### Skipping goal " + getName() + " because it has been attained already!" ); + } else { + if ( session.isGoalSatisfied( this ) ) + { +// System.out.println( "### SATISFIED ALREADY:" ); + // session.info( getName() + ":" ); + // session.info( "" ); + return; + } + + // session.info( getName() + ": checking precursors." ); + + attainPrecursors( session ); + fire(session); + context.setAttained(this, session); + } } /** Attempt to percolate this Goal through to its Postcursors. Index: src/java/org/apache/maven/werkz/Session.java =================================================================== --- src/java/org/apache/maven/werkz/Session.java (revision 170449) +++ src/java/org/apache/maven/werkz/Session.java (working copy) @@ -68,6 +68,8 @@ import java.util.Map; import java.util.HashMap; +import org.apache.maven.jelly.MavenJellyContext; + /** Goal satisfaction state. * *

@@ -217,4 +219,18 @@ // intentionally left blank } + private MavenJellyContext context = null; + + public void setContext(MavenJellyContext context) { + if ( this.context != null ) { + throw new IllegalStateException( "context already set: " + this.context ); + } + this.context = context; + + } + + public MavenJellyContext getContext() { + return context; + } + }