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); | |||||
| } | |||||
| } | |||||