Darrell DeBoer
+ * @version $Revision$ $Date$
+ */
+public abstract class AbstractAnt1AntTask
+ extends Task
+{
+ /** the target to call if any */
+ private String target = null;
+ /** should we inherit properties from the parent ? */
+ private boolean inheritAll = true;
+ /** the properties to pass to the new project */
+ private Vector properties = new Vector();
+ /** the references to pass to the new project */
+ private Vector references = new Vector();
+
+ /**
+ * If true, inherit all properties from parent Project
+ * If false, inherit only userProperties and those defined
+ * inside the ant call itself
+ */
+ public void setInheritAll( boolean value )
+ {
+ inheritAll = value;
+ }
+
+ /**
+ * set the target to execute. If none is defined it will
+ * execute the default target of the build file
+ */
+ public void setTarget( String s )
+ {
+ this.target = s;
+ }
+
+ /**
+ * Create a nested property (ant) or param (antcall) element.
+ */
+ protected Property doCreateProperty()
+ {
+ Property p = new Property( true );
+ properties.addElement( p );
+ return p;
+ }
+
+ /**
+ * create a reference element that identifies a data type that
+ * should be carried over to the new project.
+ */
+ public void addReference( Reference r )
+ {
+ references.addElement( r );
+ }
+
+ /**
+ * Helper class that implements the nested <reference>
+ * element of <ant> and <antcall>.
+ */
+ public static class Reference
+ extends org.apache.tools.ant.types.Reference
+ {
+
+ public Reference()
+ {
+ super();
+ }
+
+ private String targetid = null;
+
+ public void setToRefid( String targetid )
+ {
+ this.targetid = targetid;
+ }
+
+ public String getToRefid()
+ {
+ return targetid;
+ }
+ }
+
+ /**
+ * Removes the Ant1CompatProject from the properties, builds a TaskModel for
+ * executing the Myrmidon task, and executes that TaskModel.
+ * @throws BuildException on error
+ */
+ public void execute() throws BuildException
+ {
+ Object ant1project = unsetAnt1Project();
+
+ try
+ {
+ Configuration antConfig = constructTaskModel();
+
+ executeTask( antConfig );
+ }
+ finally
+ {
+ resetAnt1Project( ant1project );
+ }
+ }
+
+ /**
+ * Executes the Myrmidon task detailed in the TaskModel provided.
+ * @param taskModel the TaskModel for the task to execute.
+ */
+ private void executeTask( Configuration taskModel )
+ {
+ try
+ {
+ Executor executor = (Executor)m_context.getService( Executor.class );
+ ExecutionFrame frame =
+ (ExecutionFrame)m_context.getService( ExecutionFrame.class );
+ executor.execute( taskModel, frame );
+ }
+ catch( TaskException e )
+ {
+ throw new BuildException( e );
+ }
+ }
+
+ /**
+ * Removes the Ant1CompatProject from the TaskContext properties.
+ * @return the removed project
+ * @throws BuildException
+ */
+ private Object unsetAnt1Project() throws BuildException
+ {
+ Object ant1project = null;
+ try
+ {
+ ant1project =
+ m_context.getProperty( Ant1CompatProject.ANT1_PROJECT_PROP );
+ m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP, null );
+ }
+ catch( TaskException e )
+ {
+ throw new BuildException( e );
+ }
+ return ant1project;
+ }
+
+ /**
+ * Adds the Ant1CompatProject back into the TaskContext properties.
+ * @param ant1project the project to add.
+ * @throws BuildException
+ */
+ private void resetAnt1Project( Object ant1project ) throws BuildException
+ {
+ try
+ {
+ m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP,
+ ant1project );
+ }
+ catch( TaskException e )
+ {
+ throw new BuildException( e );
+ }
+ }
+
+ /**
+ * Builds the TaskModel for executing the Myrmidon version of a task.
+ * @return a Configuration containing the TaskModel
+ */
+ protected Configuration constructTaskModel()
+ {
+ DefaultConfiguration antConfig = buildTaskModel();
+
+ antConfig.setAttribute( "inherit-all", String.valueOf( inheritAll ) );
+
+ // Ignore inheritRefs for now ( inheritAll == inheritRefs )
+
+ if( target != null )
+ {
+ antConfig.setAttribute( "target", target );
+ }
+
+ addProperties( antConfig );
+ addReferences( antConfig );
+
+ return antConfig;
+ }
+
+ /**
+ * Create the Myrmidon TaskModel, and configure with subclass-specific config.
+ */
+ protected abstract DefaultConfiguration buildTaskModel();
+
+ /**
+ * Adds all defined properties to the supplied Task model.
+ * @param taskModel
+ */
+ protected void addProperties( DefaultConfiguration taskModel )
+ {
+ // Add all of the properties.
+ Iterator iter = properties.iterator();
+ while( iter.hasNext() )
+ {
+ DefaultConfiguration param = new DefaultConfiguration( "param", "" );
+ Property property = (Property)iter.next();
+ param.setAttribute( "name", property.getName() );
+ param.setAttribute( "value", property.getValue() );
+ taskModel.addChild( param );
+ }
+ }
+
+ /**
+ * Adds all defined references to the supplied Task model.
+ * @param taskModel
+ */
+ protected void addReferences( DefaultConfiguration taskModel )
+ {
+ // TODO: Handle references.
+ }
+
+}
diff --git a/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/Ant.java b/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/Ant.java
index 216db6f39..3eb0ec907 100644
--- a/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/Ant.java
+++ b/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/Ant.java
@@ -54,86 +54,47 @@
package org.apache.tools.ant.taskdefs;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.util.FileUtils;
-import org.apache.avalon.framework.configuration.DefaultConfiguration;
-import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.myrmidon.interfaces.executor.Executor;
-import org.apache.myrmidon.interfaces.executor.ExecutionFrame;
-import org.apache.myrmidon.api.TaskException;
import java.io.File;
-import java.util.Vector;
-import java.util.Iterator;
+import org.apache.avalon.framework.configuration.DefaultConfiguration;
+import org.apache.tools.ant.util.FileUtils;
/**
- * Call Ant in a sub-project.
- *
- *
- * <target name="foo" depends="init">
- * <ant antfile="build.xml" target="bar" >
- * <property name="property1" value="aaaaa" />
- * <property name="foo" value="baz" />
- * </ant>
- * </target>
- *
- * <target name="bar" depends="init">
- * <echo message="prop is ${property1} ${foo}" />
- * </target>
- *
- *
+ * Ant1Compat version of <ant>, which delegates to the Myrmidon version.
*
* @author costin@dnt.ro
* @author Darrell DeBoer
*/
-public class Ant extends Task {
+public class Ant
+ extends AbstractAnt1AntTask
+{
/** the basedir where is executed the build file */
private File dir = null;
-
+
/** the build.xml file (can be absolute) in this case dir will be ignored */
private String antFile = null;
-
- /** the target to call if any */
- private String target = null;
-
+
/** the output */
private String output = null;
-
- /** should we inherit properties from the parent ? */
- private boolean inheritAll = true;
-
+
/** should we inherit references from the parent ? */
private boolean inheritRefs = false;
-
- /** the properties to pass to the new project */
- private Vector properties = new Vector();
-
- /** the references to pass to the new project */
- private Vector references = new Vector();
-
- /**
- * If true, inherit all properties from parent Project
- * If false, inherit only userProperties and those defined
- * inside the ant call itself
- */
- public void setInheritAll(boolean value) {
- inheritAll = value;
- }
/**
* If true, inherit all references from parent Project
* If false, inherit only those defined
* inside the ant call itself
*/
- public void setInheritRefs(boolean value) {
+ public void setInheritRefs( boolean value )
+ {
inheritRefs = value;
}
/**
* ...
*/
- public void setDir(File d) {
+ public void setDir( File d )
+ {
this.dir = d;
}
@@ -142,159 +103,50 @@ public class Ant extends Task {
* If it is absolute, dir will be ignored, if it is
* relative it will be resolved relative to dir.
*/
- public void setAntfile(String s) {
+ public void setAntfile( String s )
+ {
// @note: it is a string and not a file to handle relative/absolute
// otherwise a relative file will be resolved based on the current
// basedir.
this.antFile = s;
}
- /**
- * set the target to execute. If none is defined it will
- * execute the default target of the build file
- */
- public void setTarget(String s) {
- this.target = s;
- }
-
- public void setOutput(String s) {
+ public void setOutput( String s )
+ {
this.output = s;
}
/** create a property to pass to the new project as a 'user property' */
- public Property createProperty() {
- Property p = new Property(true);
- properties.addElement( p );
- return p;
- }
-
- /**
- * create a reference element that identifies a data type that
- * should be carried over to the new project.
- */
- public void addReference(Reference r) {
- references.addElement(r);
- }
-
- /**
- * Helper class that implements the nested <reference>
- * element of <ant> and <antcall>.
- */
- public static class Reference
- extends org.apache.tools.ant.types.Reference {
-
- public Reference() {super();}
-
- private String targetid=null;
- public void setToRefid(String targetid) { this.targetid=targetid; }
- public String getToRefid() { return targetid; }
+ public Property createProperty()
+ {
+ return doCreateProperty();
}
/**
- * Called by the project to let the task do its work. This method may be
- * called more than once, if the task is invoked more than once.
- * For example,
- * if target1 and target2 both depend on target3, then running
- * "ant target1 target2" will run all tasks in target3 twice.
- *
- * @exception BuildException if something goes wrong with the build
+ * Construct a TaskModel for the Myrmidon <ant> task, and configure it
+ * with sub-class specific values (antfile).
+ * @return the TaskModel
*/
- public void execute() throws BuildException
- {
- Object ant1project = unsetProject();
-
- try
- {
- Configuration antConfig = buildAntTaskConfiguration();
-
- executeTask( antConfig );
- }
- finally
- {
- resetProject( ant1project );
- }
- }
-
- private void executeTask( Configuration antConfig )
- {
- try
- {
- Executor executor = (Executor) m_context.getService( Executor.class );
- ExecutionFrame frame =
- (ExecutionFrame) m_context.getService( ExecutionFrame.class );
- executor.execute( antConfig, frame );
- }
- catch( TaskException e )
- {
- throw new BuildException( e );
- }
- }
-
- private Configuration buildAntTaskConfiguration()
+ protected DefaultConfiguration buildTaskModel()
{
DefaultConfiguration antConfig = new DefaultConfiguration( "ant", "" );
- antConfig.setAttribute( "inherit-all", String.valueOf( inheritAll ) );
-
- // Ignore inheritRefs for now ( inheritAll == inheritRefs )
-
- if ( target != null )
- {
- antConfig.setAttribute( "target", target );
- }
-
// Get the "file" value.
- if (antFile == null) {
+ if( antFile == null )
+ {
antFile = "build.xml";
}
- if ( dir == null )
+ if( dir == null )
{
dir = project.getBaseDir();
}
- File file = FileUtils.newFileUtils().resolveFile(dir, antFile);
+ File file = FileUtils.newFileUtils().resolveFile( dir, antFile );
antFile = file.getAbsolutePath();
antConfig.setAttribute( "file", antFile );
- // Add all of the properties.
- Iterator iter = properties.iterator();
- while( iter.hasNext() )
- {
- DefaultConfiguration param = new DefaultConfiguration( "param", "" );
- Property property = (Property)iter.next();
- param.setAttribute( "name", property.getName() );
- param.setAttribute( "value", property.getValue() );
- antConfig.addChild( param );
- }
return antConfig;
}
-
- private void resetProject( Object ant1project ) throws BuildException
- {
- try
- {
- m_context.setProperty( "ant1.project", ant1project );
- }
- catch( TaskException e )
- {
- throw new BuildException( e );
- }
- }
-
- private Object unsetProject() throws BuildException
- {
- Object ant1project = null;
- try
- {
- ant1project = m_context.getProperty( "ant1.project" );
- m_context.setProperty( "ant1.project", null );
- }
- catch( TaskException e )
- {
- throw new BuildException( e );
- }
- return ant1project;
- }
}
diff --git a/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/CallTarget.java b/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/CallTarget.java
new file mode 100644
index 000000000..f54c34a2a
--- /dev/null
+++ b/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/CallTarget.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE.txt file.
+ */
+package org.apache.tools.ant.taskdefs;
+
+import org.apache.avalon.framework.configuration.DefaultConfiguration;
+
+/**
+ * The Ant1Compat version of the <antcall> task, which delegates to the
+ * Myrmidon version.
+ *
+ * @author Darrell DeBoer
+ * @version $Revision$ $Date$
+ */
+public class CallTarget extends AbstractAnt1AntTask
+{
+ /**
+ * Properties are referred to as Parameters in <antcall>
+ */
+ public Property createParam()
+ {
+ return doCreateProperty();
+ }
+
+ /**
+ * The only configuration not done by base class is the task name.
+ */
+ protected DefaultConfiguration buildTaskModel()
+ {
+ return new DefaultConfiguration( "ant-call", "" );
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/antlib/core/AbstractAntTask.java b/proposal/myrmidon/src/java/org/apache/antlib/core/AbstractAntTask.java
index a9910dbf8..1a7c1d820 100644
--- a/proposal/myrmidon/src/java/org/apache/antlib/core/AbstractAntTask.java
+++ b/proposal/myrmidon/src/java/org/apache/antlib/core/AbstractAntTask.java
@@ -37,6 +37,11 @@ public abstract class AbstractAntTask extends AbstractTask
* will use default in specified build file.
*/
private String m_target;
+
+ /**
+ * The parameters/properties which will be passed to the workspace
+ * for the target execution.
+ */
private final ArrayList m_parameters = new ArrayList();
/**
diff --git a/proposal/myrmidon/src/test/org/apache/tools/ant/test/Ant1CompatTestCase.java b/proposal/myrmidon/src/test/org/apache/tools/ant/test/Ant1CompatTestCase.java
index b7babd6c7..333cc54f7 100644
--- a/proposal/myrmidon/src/test/org/apache/tools/ant/test/Ant1CompatTestCase.java
+++ b/proposal/myrmidon/src/test/org/apache/tools/ant/test/Ant1CompatTestCase.java
@@ -96,8 +96,31 @@ public class Ant1CompatTestCase
"test-prop = [set in calling task]" );
tracker.addExpectedMessage( "property-test",
"test-prop = [set in calling target]" );
- // executeTarget( projectFile, "ant-setprops-test", tracker );
+ tracker.addExpectedMessage( "property-test",
+ "test-prop = [test-value]" );
+ // executeTarget( projectFile, "ant-setprops-test", tracker );
executeTarget( projectFile, "ant-setprops-test" );
}
+ public void testAntcallTask() throws Exception
+ {
+ final File projectFile = getTestResource( "antcall-task-test.xml" );
+
+ // TODO - Get the project listeners working, so we can test log messages.
+
+ LogMessageTracker tracker = new LogMessageTracker();
+ tracker.addExpectedMessage( "default-target",
+ "In default target." );
+ tracker.addExpectedMessage( "antcall-target",
+ "In antcall-target: test-prop = [test-value]" );
+ tracker.addExpectedMessage( "antcall-target",
+ "In antcall-target: test-prop = [set in calling task]" );
+ tracker.addExpectedMessage( "antcall-target",
+ "In antcall-target: test-prop = [set in calling target]" );
+ tracker.addExpectedMessage( "antcall-target",
+ "In antcall-target: test-prop = [test-value]" );
+ // executeTarget( projectFile, "ant-samefile-test", tracker );
+ executeTarget( projectFile, "antcall-test" );
+ }
+
}
diff --git a/proposal/myrmidon/src/test/org/apache/tools/ant/test/ant-task-test.xml b/proposal/myrmidon/src/test/org/apache/tools/ant/test/ant-task-test.xml
index 0e09c3b33..a867e8f69 100644
--- a/proposal/myrmidon/src/test/org/apache/tools/ant/test/ant-task-test.xml
+++ b/proposal/myrmidon/src/test/org/apache/tools/ant/test/ant-task-test.xml
@@ -1,5 +1,4 @@
@@ -47,6 +46,10 @@
+
+
+
-
\ No newline at end of file
+
diff --git a/proposal/myrmidon/src/test/org/apache/tools/ant/test/antcall-task-test.xml b/proposal/myrmidon/src/test/org/apache/tools/ant/test/antcall-task-test.xml
new file mode 100644
index 000000000..fbcf82de2
--- /dev/null
+++ b/proposal/myrmidon/src/test/org/apache/tools/ant/test/antcall-task-test.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/proposal/myrmidon/src/test/org/apache/tools/ant/test/basic-test.xml b/proposal/myrmidon/src/test/org/apache/tools/ant/test/basic-test.xml
index 93e2f0b18..bce9a80d8 100644
--- a/proposal/myrmidon/src/test/org/apache/tools/ant/test/basic-test.xml
+++ b/proposal/myrmidon/src/test/org/apache/tools/ant/test/basic-test.xml
@@ -1,5 +1,4 @@
@@ -19,4 +18,4 @@
-
\ No newline at end of file
+
diff --git a/proposal/myrmidon/src/test/org/apache/tools/ant/test/if-unless-test.xml b/proposal/myrmidon/src/test/org/apache/tools/ant/test/if-unless-test.xml
index 0838632ea..97e8a63aa 100644
--- a/proposal/myrmidon/src/test/org/apache/tools/ant/test/if-unless-test.xml
+++ b/proposal/myrmidon/src/test/org/apache/tools/ant/test/if-unless-test.xml
@@ -1,5 +1,4 @@
-
\ No newline at end of file
+