Browse Source

Fix up handling of TaskContainer configuration.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274402 13f79535-47bb-0310-9956-ffa450edef68
master
Conor MacNeill 22 years ago
parent
commit
bfad69862e
9 changed files with 58 additions and 55 deletions
  1. +0
    -1
      build.xml
  2. +12
    -0
      src/etc/testcases/core/containersrc/test/SpecialSeq.java
  3. +2
    -0
      src/etc/testcases/core/taskcontainer.xml
  4. +2
    -1
      src/main/org/apache/tools/ant/IntrospectionHelper.java
  5. +11
    -12
      src/main/org/apache/tools/ant/RuntimeConfigurable.java
  6. +10
    -0
      src/main/org/apache/tools/ant/Task.java
  7. +17
    -34
      src/main/org/apache/tools/ant/UnknownElement.java
  8. +2
    -7
      src/main/org/apache/tools/ant/helper/ProjectHelper2.java
  9. +2
    -0
      src/testcases/org/apache/tools/ant/TaskContainerTest.java

+ 0
- 1
build.xml View File

@@ -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>


<!-- <!--


+ 12
- 0
src/etc/testcases/core/containersrc/test/SpecialSeq.java View File

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

+ 2
- 0
src/etc/testcases/core/taskcontainer.xml View File

@@ -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>


+ 2
- 1
src/main/org/apache/tools/ant/IntrospectionHelper.java View File

@@ -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);
} }
/** /**


+ 11
- 12
src/main/org/apache/tools/ant/RuntimeConfigurable.java View File

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

+ 10
- 0
src/main/org/apache/tools/ant/Task.java View File

@@ -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.
* *


+ 17
- 34
src/main/org/apache/tools/ant/UnknownElement.java View File

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




+ 2
- 7
src/main/org/apache/tools/ant/helper/ProjectHelper2.java View File

@@ -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 {
}
} }
} }

+ 2
- 0
src/testcases/org/apache/tools/ant/TaskContainerTest.java View File

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


} }

Loading…
Cancel
Save