From a08711cd91e80ad69a52d6dc84deca1230e6ad01 Mon Sep 17 00:00:00 2001 From: Darrell DeBoer Date: Sat, 30 Mar 2002 06:56:04 +0000 Subject: [PATCH] * Added task, and test. and now share a common abstract base class. * Fixed test files so that they run under Ant1.4, for checking. * Fixed build so that ant1_todo.atl only includes the correct files. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272107 13f79535-47bb-0310-9956-ffa450edef68 --- proposal/myrmidon/build.xml | 2 +- .../src/ant1compat/ant-descriptor.xml | 8 +- .../apache/tools/ant/Ant1CompatProject.java | 6 +- .../ant1compat/org/apache/tools/ant/Task.java | 5 +- .../ant/taskdefs/AbstractAnt1AntTask.java | 238 ++++++++++++++++++ .../org/apache/tools/ant/taskdefs/Ant.java | 204 +++------------ .../apache/tools/ant/taskdefs/CallTarget.java | 36 +++ .../apache/antlib/core/AbstractAntTask.java | 5 + .../tools/ant/test/Ant1CompatTestCase.java | 25 +- .../apache/tools/ant/test/ant-task-test.xml | 7 +- .../tools/ant/test/antcall-task-test.xml | 34 +++ .../org/apache/tools/ant/test/basic-test.xml | 3 +- .../apache/tools/ant/test/if-unless-test.xml | 3 +- 13 files changed, 380 insertions(+), 196 deletions(-) create mode 100644 proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/AbstractAnt1AntTask.java create mode 100644 proposal/myrmidon/src/ant1compat/org/apache/tools/ant/taskdefs/CallTarget.java create mode 100644 proposal/myrmidon/src/test/org/apache/tools/ant/test/antcall-task-test.xml diff --git a/proposal/myrmidon/build.xml b/proposal/myrmidon/build.xml index 58217bfd1..1dd30f7a9 100644 --- a/proposal/myrmidon/build.xml +++ b/proposal/myrmidon/build.xml @@ -306,7 +306,7 @@ Legal: - + - - + 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 +