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