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/taskdefs/TaskdefsTest.java" /> | ||||
<exclude name="org/apache/tools/ant/util/regexp/RegexpMatcherTest.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???? --> | <!-- these tests need to be localised before being ran???? --> | ||||
<exclude name="org/apache/tools/ant/taskdefs/optional/PvcsTest.java" /> | <exclude name="org/apache/tools/ant/taskdefs/optional/PvcsTest.java" /> | ||||
@@ -22,4 +22,21 @@ | |||||
<taskdef name="test" classname="org.apache.tools.ant.Project" /> | <taskdef name="test" classname="org.apache.tools.ant.Project" /> | ||||
</target> | </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> | </project> |
@@ -80,27 +80,7 @@ public class UnknownElement extends Task { | |||||
} | } | ||||
public void maybeConfigure() throws BuildException { | 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); | wrapper.setProxy(realTask); | ||||
realTask.setRuntimeConfigurableWrapper(wrapper); | realTask.setRuntimeConfigurableWrapper(wrapper); | ||||
@@ -135,16 +115,58 @@ public class UnknownElement extends Task { | |||||
if (parent instanceof TaskAdapter) { | if (parent instanceof TaskAdapter) { | ||||
parent = ((TaskAdapter) parent).getProxy(); | parent = ((TaskAdapter) parent).getProxy(); | ||||
} | } | ||||
Class parentClass = parent.getClass(); | Class parentClass = parent.getClass(); | ||||
IntrospectionHelper ih = IntrospectionHelper.getHelper(parentClass); | IntrospectionHelper ih = IntrospectionHelper.getHelper(parentClass); | ||||
for (int i=0; i<children.size(); i++) { | 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); | 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); | childWrapper.setProxy(realChild); | ||||
if (realChild instanceof Task) { | |||||
((Task) realChild).setRuntimeConfigurableWrapper(childWrapper); | |||||
} | |||||
child.handleChildren(realChild, 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 | }// UnknownElement |
@@ -86,4 +86,14 @@ public class TaskdefTest extends TaskdefsTest { | |||||
public void test5() { | public void test5() { | ||||
executeTarget("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); | |||||
} | |||||
} | |||||