git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274402 13f79535-47bb-0310-9956-ffa450edef68master
@@ -302,7 +302,6 @@ | |||||
<patternset id="teststhatfail"> | <patternset id="teststhatfail"> | ||||
<exclude name="${optional.package}/BeanShellScriptTest.java"/> | <exclude name="${optional.package}/BeanShellScriptTest.java"/> | ||||
<exclude name="${ant.package}/taskdefs/ImportTest.java"/> | <exclude name="${ant.package}/taskdefs/ImportTest.java"/> | ||||
<exclude name="${ant.package}/TaskContainerTest.java"/> | |||||
</patternset> | </patternset> | ||||
<!-- | <!-- | ||||
@@ -57,6 +57,7 @@ import org.apache.tools.ant.Task; | |||||
import org.apache.tools.ant.TaskContainer; | import org.apache.tools.ant.TaskContainer; | ||||
import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
import org.apache.tools.ant.types.FileSet; | import org.apache.tools.ant.types.FileSet; | ||||
import org.apache.tools.ant.taskdefs.Echo; | |||||
import java.util.*; | import java.util.*; | ||||
public class SpecialSeq extends Task implements TaskContainer { | public class SpecialSeq extends Task implements TaskContainer { | ||||
@@ -65,6 +66,8 @@ public class SpecialSeq extends Task implements TaskContainer { | |||||
private FileSet fileset; | private FileSet fileset; | ||||
private Echo nestedEcho; | |||||
/** | /** | ||||
* Add a nested task. | * Add a nested task. | ||||
* <p> | * <p> | ||||
@@ -79,13 +82,22 @@ public class SpecialSeq extends Task implements TaskContainer { | |||||
* Execute all nestedTasks. | * Execute all nestedTasks. | ||||
*/ | */ | ||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
if (fileset == null || fileset.getDir(getProject()) == null) { | |||||
throw new BuildException("Fileset was not configured"); | |||||
} | |||||
for (Enumeration e = nestedTasks.elements(); e.hasMoreElements();) { | for (Enumeration e = nestedTasks.elements(); e.hasMoreElements();) { | ||||
Task nestedTask = (Task) e.nextElement(); | Task nestedTask = (Task) e.nextElement(); | ||||
nestedTask.perform(); | nestedTask.perform(); | ||||
} | } | ||||
nestedEcho.reconfigure(); | |||||
nestedEcho.perform(); | |||||
} | } | ||||
public void addFileset(FileSet fileset) { | public void addFileset(FileSet fileset) { | ||||
this.fileset = fileset; | this.fileset = fileset; | ||||
} | } | ||||
public void addNested(Echo nestedEcho) { | |||||
this.nestedEcho = nestedEcho; | |||||
} | |||||
} | } |
@@ -22,9 +22,11 @@ | |||||
<sequential> | <sequential> | ||||
<taskdef name="sseq" classpath="${build.dir}" classname="test.SpecialSeq"/> | <taskdef name="sseq" classpath="${build.dir}" classname="test.SpecialSeq"/> | ||||
<sseq> | <sseq> | ||||
<fileset dir="."/> | |||||
<property name="foo" value="it worked"/> | <property name="foo" value="it worked"/> | ||||
<echo message="As attribute: ${foo}"/> | <echo message="As attribute: ${foo}"/> | ||||
<echo>As nested text: ${foo}</echo> | <echo>As nested text: ${foo}</echo> | ||||
<nested message="As nested task: ${foo}"/> | |||||
</sseq> | </sseq> | ||||
</sequential> | </sequential> | ||||
</target> | </target> | ||||
@@ -577,7 +577,8 @@ public class IntrospectionHelper implements BuildListener { | |||||
* @return true if the given nested element is supported | * @return true if the given nested element is supported | ||||
*/ | */ | ||||
public boolean supportsNestedElement(String elementName) { | public boolean supportsNestedElement(String elementName) { | ||||
return nestedCreators.containsKey(elementName); | |||||
return nestedCreators.containsKey(elementName) || | |||||
DynamicConfigurator.class.isAssignableFrom(bean); | |||||
} | } | ||||
/** | /** | ||||
@@ -336,18 +336,9 @@ public class RuntimeConfigurable implements Serializable { | |||||
childTask.setRuntimeConfigurableWrapper(child); | childTask.setRuntimeConfigurableWrapper(child); | ||||
} | } | ||||
if (configureChildren) { | |||||
if (child.wrappedObject instanceof Task) { | |||||
Task childTask = (Task) child.wrappedObject; | |||||
// we don't configure tasks of task containers These | |||||
// we be configured at the time they are used. | |||||
if (!(target instanceof TaskContainer)) { | |||||
childTask.maybeConfigure(); | |||||
} | |||||
} else { | |||||
child.maybeConfigure(p); | |||||
} | |||||
if (configureChildren | |||||
&& ih.supportsNestedElement(child.getElementTag())) { | |||||
child.maybeConfigure(p); | |||||
Object container = wrappedObject; | Object container = wrappedObject; | ||||
if (container instanceof TaskAdapter) { | if (container instanceof TaskAdapter) { | ||||
container = ((TaskAdapter) container).getProxy(); | container = ((TaskAdapter) container).getProxy(); | ||||
@@ -363,4 +354,12 @@ public class RuntimeConfigurable implements Serializable { | |||||
} | } | ||||
proxyConfigured = true; | proxyConfigured = true; | ||||
} | } | ||||
/** | |||||
* Reconfigure the element, even if it has already been configured. | |||||
*/ | |||||
public void reconfigure(Project p) { | |||||
proxyConfigured = false; | |||||
maybeConfigure(p); | |||||
} | |||||
} | } |
@@ -293,6 +293,16 @@ public abstract class Task extends ProjectComponent { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* Force the task to be reconfigured from it's RuntimeConfigurable | |||||
* | |||||
*/ | |||||
public void reconfigure() { | |||||
if (wrapper != null) { | |||||
wrapper.reconfigure(getProject()); | |||||
} | |||||
} | |||||
/** | /** | ||||
* Handles a line of output by logging it with the INFO priority. | * Handles a line of output by logging it with the INFO priority. | ||||
* | * | ||||
@@ -127,12 +127,7 @@ public class UnknownElement extends Task { | |||||
if (realThing instanceof Task) { | if (realThing instanceof Task) { | ||||
Task task = (Task) realThing; | Task task = (Task) realThing; | ||||
task.setProject(project); | |||||
task.setRuntimeConfigurableWrapper(getWrapper()); | task.setRuntimeConfigurableWrapper(getWrapper()); | ||||
task.setLocation(this.getLocation()); | |||||
// UnknownElement always has an associated target | |||||
task.setOwningTarget(this.getOwningTarget()); | |||||
task.init(); | |||||
// For Script to work. Ugly | // For Script to work. Ugly | ||||
// The reference is replaced by RuntimeConfigurable | // The reference is replaced by RuntimeConfigurable | ||||
@@ -272,38 +267,26 @@ public class UnknownElement extends Task { | |||||
UnknownElement child = (UnknownElement) children.elementAt(i); | UnknownElement child = (UnknownElement) children.elementAt(i); | ||||
Object realChild = null; | Object realChild = null; | ||||
if (!ih.supportsNestedElement(child.getTag()) | |||||
&& parent instanceof TaskContainer) { | |||||
realChild = makeTask(child, childWrapper); | |||||
if (realChild == null) { | |||||
ih.throwNotSupported(getProject(), parent, child.getTag()); | |||||
} | |||||
// XXX DataTypes will be wrapped or treated like normal components | |||||
if (realChild instanceof Task) { | |||||
Task task = (Task) realChild; | |||||
((TaskContainer) parent).addTask(task); | |||||
task.setLocation(child.getLocation()); | |||||
// UnknownElement always has an associated target | |||||
task.setOwningTarget(this.getOwningTarget()); | |||||
task.init(); | |||||
} else { | |||||
// should not happen | |||||
ih.throwNotSupported(getProject(), parent, child.getTag()); | |||||
} | |||||
} else { | |||||
if (ih.supportsNestedElement(child.getTag())) { | |||||
realChild | realChild | ||||
= ih.createElement(getProject(), parent, child.getTag()); | = ih.createElement(getProject(), parent, child.getTag()); | ||||
} | |||||
childWrapper.setProxy(realChild); | |||||
if (parent instanceof TaskContainer | |||||
&& realChild instanceof Task) { | |||||
((Task) realChild).setRuntimeConfigurableWrapper(childWrapper); | |||||
} | |||||
childWrapper.setProxy(realChild); | |||||
if (realChild instanceof Task) { | |||||
Task childTask = (Task) realChild; | |||||
childTask.setRuntimeConfigurableWrapper(childWrapper); | |||||
childTask.setTaskName(child.getTag()); | |||||
childTask.setTaskType(child.getTag()); | |||||
} | |||||
child.handleChildren(realChild, childWrapper); | |||||
child.handleChildren(realChild, childWrapper); | |||||
} else if (!(parent instanceof TaskContainer)) { | |||||
ih.throwNotSupported(getProject(), parent, child.getTag()); | |||||
} else { | |||||
// a task container - anything could happen - just add the | |||||
// child to the container | |||||
TaskContainer container = (TaskContainer) parent; | |||||
container.addTask(child); | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -745,7 +745,6 @@ public class ProjectHelper2 extends ProjectHelper { | |||||
AntXMLContext context) | AntXMLContext context) | ||||
throws SAXParseException { | throws SAXParseException { | ||||
RuntimeConfigurable parentWrapper = context.currentWrapper(); | RuntimeConfigurable parentWrapper = context.currentWrapper(); | ||||
RuntimeConfigurable wrapper = null; | |||||
Object parent = null; | Object parent = null; | ||||
if (parentWrapper != null) { | if (parentWrapper != null) { | ||||
@@ -796,7 +795,8 @@ public class ProjectHelper2 extends ProjectHelper { | |||||
// container.addTask(task); | // container.addTask(task); | ||||
// This is a nop in UE: task.init(); | // This is a nop in UE: task.init(); | ||||
wrapper = new RuntimeConfigurable(task, task.getTaskName()); | |||||
RuntimeConfigurable wrapper | |||||
= new RuntimeConfigurable(task, task.getTaskName()); | |||||
for (int i = 0; i < attrs.getLength(); i++) { | for (int i = 0; i < attrs.getLength(); i++) { | ||||
wrapper.setAttribute(attrs.getQName(i), | wrapper.setAttribute(attrs.getQName(i), | ||||
@@ -852,10 +852,5 @@ public class ProjectHelper2 extends ProjectHelper { | |||||
public void onEndElement(String uri, String tag, AntXMLContext context) { | public void onEndElement(String uri, String tag, AntXMLContext context) { | ||||
context.popWrapper(); | context.popWrapper(); | ||||
} | } | ||||
public void onEndChild(String uri, String tag, String qname, | |||||
AntXMLContext context) | |||||
throws SAXParseException { | |||||
} | |||||
} | } | ||||
} | } |
@@ -82,6 +82,8 @@ public class TaskContainerTest extends BuildFileTest { | |||||
getLog().indexOf("As attribute: it worked") > -1); | getLog().indexOf("As attribute: it worked") > -1); | ||||
assertTrue("nested text worked", | assertTrue("nested text worked", | ||||
getLog().indexOf("As nested text: it worked") > -1); | getLog().indexOf("As nested text: it worked") > -1); | ||||
assertTrue("nested text worked", | |||||
getLog().indexOf("As nested task: it worked") > -1); | |||||
} | } | ||||
} | } |