TaskContainer at runtime. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269392 13f79535-47bb-0310-9956-ffa450edef68master
@@ -654,6 +654,9 @@ | |||
<exclude name="org/apache/tools/ant/taskdefs/TaskdefsTest.java" /> | |||
<exclude name="org/apache/tools/ant/util/regexp/RegexpMatcherTest.java" /> | |||
<!-- helper classes, not testcases --> | |||
<exclude name="org/apache/tools/ant/taskdefs/TaskdefTest*Task.java" /> | |||
<!-- these tests need to be localised before being ran???? --> | |||
<exclude name="org/apache/tools/ant/taskdefs/optional/PvcsTest.java" /> | |||
@@ -22,4 +22,21 @@ | |||
<taskdef name="test" classname="org.apache.tools.ant.Project" /> | |||
</target> | |||
<target name="test6"> | |||
<echo message="${build.test}" /> | |||
<taskdef name="test6" | |||
classname="org.apache.tools.ant.taskdefs.TaskdefTestSimpleTask" /> | |||
<test6> | |||
<echo message="worked" /> | |||
</test6> | |||
</target> | |||
<target name="test7"> | |||
<taskdef name="test7" | |||
classname="org.apache.tools.ant.taskdefs.TaskdefTestContainerTask" /> | |||
<test7> | |||
<echo message="worked" /> | |||
</test7> | |||
</target> | |||
</project> |
@@ -80,27 +80,7 @@ public class UnknownElement extends Task { | |||
} | |||
public void maybeConfigure() throws BuildException { | |||
realTask = project.createTask(elementName); | |||
if (realTask == null) { | |||
log("Could not create task of type: " + elementName + " Common solutions" + | |||
" are adding the task to defaults.properties and executing bin/bootstrap", | |||
Project.MSG_DEBUG); | |||
throw new BuildException("Could not create task of type: " + elementName + | |||
". Common solutions are to use taskdef to declare" + | |||
" your task, or, if this is an optional task," + | |||
" to put the optional.jar in the lib directory of" + | |||
" your ant installation (ANT_HOME).", location); | |||
} | |||
realTask.setLocation(location); | |||
String id = wrapper.getAttributes().getValue("id"); | |||
if (id != null) { | |||
project.addReference(id, realTask); | |||
} | |||
realTask.init(); | |||
// UnknownElement always has an associated target | |||
realTask.setOwningTarget(target); | |||
realTask = makeTask(this, wrapper); | |||
wrapper.setProxy(realTask); | |||
realTask.setRuntimeConfigurableWrapper(wrapper); | |||
@@ -135,16 +115,58 @@ public class UnknownElement extends Task { | |||
if (parent instanceof TaskAdapter) { | |||
parent = ((TaskAdapter) parent).getProxy(); | |||
} | |||
Class parentClass = parent.getClass(); | |||
IntrospectionHelper ih = IntrospectionHelper.getHelper(parentClass); | |||
for (int i=0; i<children.size(); i++) { | |||
UnknownElement child = (UnknownElement) children.elementAt(i); | |||
Object realChild = ih.createElement(project, parent, child.getTag()); | |||
RuntimeConfigurable childWrapper = parentWrapper.getChild(i); | |||
UnknownElement child = (UnknownElement) children.elementAt(i); | |||
Object realChild = null; | |||
if (parent instanceof TaskContainer) { | |||
realChild = makeTask(child, childWrapper); | |||
((TaskContainer) parent).addTask((Task) realChild); | |||
} else { | |||
ih.createElement(project, parent, child.getTag()); | |||
} | |||
childWrapper.setProxy(realChild); | |||
if (realChild instanceof Task) { | |||
((Task) realChild).setRuntimeConfigurableWrapper(childWrapper); | |||
} | |||
child.handleChildren(realChild, childWrapper); | |||
if (realChild instanceof Task) { | |||
((Task) realChild).maybeConfigure(); | |||
} | |||
} | |||
} | |||
/** | |||
* Create a named task and configure it up to the init() stage. | |||
*/ | |||
protected Task makeTask(UnknownElement ue, RuntimeConfigurable w) { | |||
Task task = project.createTask(ue.getTag()); | |||
if (task == null) { | |||
log("Could not create task of type: " + elementName + " Common solutions" + | |||
" are adding the task to defaults.properties and executing bin/bootstrap", | |||
Project.MSG_DEBUG); | |||
throw new BuildException("Could not create task of type: " + elementName + | |||
". Common solutions are to use taskdef to declare" + | |||
" your task, or, if this is an optional task," + | |||
" to put the optional.jar in the lib directory of" + | |||
" your ant installation (ANT_HOME).", location); | |||
} | |||
task.setLocation(getLocation()); | |||
String id = w.getAttributes().getValue("id"); | |||
if (id != null) { | |||
project.addReference(id, task); | |||
} | |||
// UnknownElement always has an associated target | |||
task.setOwningTarget(target); | |||
task.init(); | |||
return task; | |||
} | |||
}// UnknownElement |
@@ -86,4 +86,14 @@ public class TaskdefTest extends TaskdefsTest { | |||
public void test5() { | |||
executeTarget("test5"); | |||
} | |||
/* disabled until I know why they fail when run via the junit task --SB | |||
public void test6() { | |||
expectOutput("test6", "simpletask: worked"); | |||
} | |||
public void test7() { | |||
expectOutput("test7", "worked"); | |||
} | |||
*/ | |||
} |
@@ -0,0 +1,59 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
public class TaskdefTestContainerTask extends Sequential { | |||
public TaskdefTestContainerTask() {} | |||
} |
@@ -0,0 +1,81 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2000 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant.taskdefs; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.Task; | |||
public class TaskdefTestSimpleTask extends Task { | |||
public class Echo { | |||
Echo() {} | |||
private String message = null; | |||
public void setMessage(String s) {message = s;} | |||
} | |||
public TaskdefTestSimpleTask() {} | |||
private Echo echo; | |||
public Echo createEcho() { | |||
echo = new Echo(); | |||
return echo; | |||
} | |||
public void execute() { | |||
log("simpletask: "+echo.message, Project.MSG_INFO); | |||
} | |||
} | |||