share a common abstract base class. * Fixed <ant1> 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-ffa450edef68master
@@ -306,7 +306,7 @@ Legal: | |||
<property name="regexp.package" value="${util.package}/regexp"/> | |||
<patternset id="ant1.todo.include"> | |||
<include name="org/apache/tools/**" /> | |||
<include name="org/apache/tools/todo/**" /> | |||
<exclude name="${regexp.package}/JakartaRegexp*.java" | |||
unless="jakarta.regexp.present" /> | |||
<exclude name="${regexp.package}/JakartaOro*.java" | |||
@@ -16,12 +16,8 @@ | |||
<!-- Tasks specialised for myrmidon --> | |||
<task name="ant1.ant" | |||
classname="org.apache.tools.ant.taskdefs.Ant" /> | |||
<!-- Tasks not currently supported. | |||
<task name="ant1.antcall" | |||
classname="org.apache.tools.ant.taskdefs.CallTarget" /> | |||
--> | |||
<task name="ant1.antcall" | |||
classname="org.apache.tools.ant.taskdefs.CallTarget" /> | |||
<!-- standard ant tasks --> | |||
<task name="ant1.mkdir" | |||
@@ -10,7 +10,7 @@ package org.apache.tools.ant; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.net.URL; | |||
import java.security.CodeSource; | |||
import java.util.Enumeration; | |||
import java.util.HashSet; | |||
import java.util.Hashtable; | |||
@@ -18,7 +18,6 @@ import java.util.Iterator; | |||
import java.util.Map; | |||
import java.util.Properties; | |||
import java.util.Set; | |||
import java.security.CodeSource; | |||
import org.apache.aut.converter.Converter; | |||
import org.apache.aut.converter.ConverterException; | |||
import org.apache.myrmidon.api.TaskContext; | |||
@@ -41,6 +40,7 @@ public class Ant1CompatProject extends Project | |||
public static final String ANT1_TASK_PREFIX = "ant1."; | |||
public static final String MYRMIDON_PROJECT_PROP = | |||
org.apache.myrmidon.interfaces.model.Project.PROJECT; | |||
public static final String ANT1_PROJECT_PROP = "ant1.project"; | |||
private static String javaclasspath; | |||
@@ -74,7 +74,7 @@ public class Ant1CompatProject extends Project | |||
setBaseDir( m_context.getBaseDirectory() ); | |||
String projectName = | |||
(String) m_context.getProperty( MYRMIDON_PROJECT_PROP ); | |||
(String)m_context.getProperty( MYRMIDON_PROJECT_PROP ); | |||
if( projectName != null ) | |||
{ | |||
setName( projectName ); | |||
@@ -27,7 +27,6 @@ import org.apache.myrmidon.api.TaskException; | |||
public class Task extends OriginalAnt1Task | |||
implements org.apache.myrmidon.api.Task, Configurable | |||
{ | |||
private static final String ANT1_PROJECT_PROP = "ant1.project"; | |||
protected TaskContext m_context; | |||
/** | |||
@@ -45,11 +44,11 @@ public class Task extends OriginalAnt1Task | |||
// Create/recontextualise the Ant1 Project. | |||
Ant1CompatProject project = | |||
(Ant1CompatProject)context.getProperty( ANT1_PROJECT_PROP ); | |||
(Ant1CompatProject)context.getProperty( Ant1CompatProject.ANT1_PROJECT_PROP ); | |||
if( project == null ) | |||
{ | |||
project = createProject(); | |||
m_context.setProperty( ANT1_PROJECT_PROP, project ); | |||
m_context.setProperty( Ant1CompatProject.ANT1_PROJECT_PROP, project ); | |||
} | |||
else | |||
{ | |||
@@ -0,0 +1,238 @@ | |||
/* | |||
* 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 java.util.Iterator; | |||
import java.util.Vector; | |||
import org.apache.avalon.framework.configuration.Configuration; | |||
import org.apache.avalon.framework.configuration.DefaultConfiguration; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.myrmidon.interfaces.executor.ExecutionFrame; | |||
import org.apache.myrmidon.interfaces.executor.Executor; | |||
import org.apache.tools.ant.Ant1CompatProject; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Task; | |||
/** | |||
* A base class for Ant1 versions of <ant> and <antcall> tasks, | |||
* which delegate to the Myrmidon versions of these tasks. | |||
* | |||
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
* @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. | |||
} | |||
} |
@@ -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. | |||
* | |||
* <pre> | |||
* <target name="foo" depends="init"> | |||
* <ant antfile="build.xml" target="bar" > | |||
* <property name="property1" value="aaaaa" /> | |||
* <property name="foo" value="baz" /> | |||
* </ant></SPAN> | |||
* </target></SPAN> | |||
* | |||
* <target name="bar" depends="init"> | |||
* <echo message="prop is ${property1} ${foo}" /> | |||
* </target> | |||
* </pre> | |||
* | |||
* Ant1Compat version of <ant>, which delegates to the Myrmidon version. | |||
* | |||
* @author costin@dnt.ro | |||
* @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
*/ | |||
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, <tt>dir</tt> will be ignored, if it is | |||
* relative it will be resolved relative to <tt>dir</tt>. | |||
*/ | |||
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; | |||
} | |||
} |
@@ -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 <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
* @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", "" ); | |||
} | |||
} |
@@ -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(); | |||
/** | |||
@@ -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 <ant> 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" ); | |||
} | |||
} |
@@ -1,5 +1,4 @@ | |||
<project name="ant-task-test" | |||
description="Tests for the <ant> task in the Ant1 Compatibility layer." | |||
default="default-target"> | |||
<target name="default-target"> | |||
@@ -47,6 +46,10 @@ | |||
<!-- Override property in containing project --> | |||
<property name="test-prop" value="set in calling target"/> | |||
<ant antfile="subdir/build.xml" target="property-test"/> | |||
<!-- Test inherit-all = false --> | |||
<ant antfile="subdir/build.xml" target="property-test" | |||
inheritall="false"/> | |||
</target> | |||
</project> | |||
</project> |
@@ -0,0 +1,34 @@ | |||
<project name="antcall-task-test" | |||
default="default-target"> | |||
<target name="default-target"> | |||
<echo message="In default target."/> | |||
</target> | |||
<target name="antcall-target"> | |||
<property name="test-prop" value="test-value"/> | |||
<echo message="In antcall-target: test-prop = [${test-prop}]"/> | |||
</target> | |||
<!-- Basic <antcall> --> | |||
<target name="antcall-test"> | |||
<!-- <antcall with default target --> | |||
<antcall/> | |||
<!-- <antcall> with defined target (No property overrides) --> | |||
<antcall target="antcall-target"/> | |||
<!-- Override property within task def --> | |||
<antcall target="antcall-target"> | |||
<param name="test-prop" value="set in calling task"/> | |||
</antcall> | |||
<!-- Override property in containing project --> | |||
<property name="test-prop" value="set in calling target"/> | |||
<antcall target="antcall-target"/> | |||
<!-- Test inherit-all = false --> | |||
<antcall target="antcall-target" inheritall="false"/> | |||
</target> | |||
</project> |
@@ -1,5 +1,4 @@ | |||
<project name="ant1compat-test" | |||
description="Basic tests for the Ant1 Compatibility layer." | |||
default="echo-test"> | |||
<property name="prop-1" value="value-1"/> | |||
@@ -19,4 +18,4 @@ | |||
<echo message="Omit$, replace$$, but keep ${} and $"/> | |||
</target> | |||
</project> | |||
</project> |
@@ -1,5 +1,4 @@ | |||
<project name="if-unless-test" | |||
description="Tests for if/unless functionality of the Ant1 Compatibility layer." | |||
default="if-unless-tests"> | |||
<target name="if-unless-tests" | |||
@@ -60,4 +59,4 @@ | |||
<target name="if-with-unless-test-3" if="prop-set" unless="prop-set"> | |||
<echo message="Ran target: if-with-unless-test-3"/> | |||
</target> | |||
</project> | |||
</project> |