diff --git a/src/main/org/apache/tools/ant/Task.java b/src/main/org/apache/tools/ant/Task.java index 7586c4c47..d1a4d3667 100644 --- a/src/main/org/apache/tools/ant/Task.java +++ b/src/main/org/apache/tools/ant/Task.java @@ -17,6 +17,8 @@ package org.apache.tools.ant; +import org.apache.tools.ant.dispatch.DispatchUtils; + import java.util.Enumeration; import java.io.IOException; @@ -361,7 +363,7 @@ public abstract class Task extends ProjectComponent { Throwable reason = null; try { maybeConfigure(); - execute(); + DispatchUtils.execute(this); } catch (BuildException ex) { if (ex.getLocation() == Location.UNKNOWN_LOCATION) { ex.setLocation(getLocation()); diff --git a/src/main/org/apache/tools/ant/TaskAdapter.java b/src/main/org/apache/tools/ant/TaskAdapter.java index 99b392393..cc005e2e3 100644 --- a/src/main/org/apache/tools/ant/TaskAdapter.java +++ b/src/main/org/apache/tools/ant/TaskAdapter.java @@ -17,9 +17,9 @@ package org.apache.tools.ant; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.apache.tools.ant.dispatch.Dispatchable; +import org.apache.tools.ant.dispatch.DispatchUtils; /** * Uses introspection to "adapt" an arbitrary Bean which doesn't @@ -92,37 +92,6 @@ public class TaskAdapter extends Task implements TypeAdapter { checkTaskClass(proxyClass, getProject()); } - /** - * Returns the name of the action method that the task must - * execute. - */ - private final String getExecuteMethodName() throws NoSuchMethodException, - InvocationTargetException, IllegalAccessException { - String methodName = "execute"; - if (proxy instanceof Dispatchable) { - final Dispatchable dispatchable = (Dispatchable) proxy; - final String name = dispatchable.getActionParameterName(); - if (name != null && name.trim().length() > 0) { - String mName = "get" + name.trim().substring(0, 1).toUpperCase(); - if (name.length() > 1) { - mName += name.substring(1); - } - final Class c = proxy.getClass(); - final Method actionM = c.getMethod(mName, new Class[0]); - if (actionM != null) { - final Object o = actionM.invoke(proxy, null); - if (o != null) { - final String s = o.toString(); - if (s != null && s.trim().length() > 0) { - methodName = s.trim(); - } - } - } - } - } - return methodName; - } - /** * Executes the proxied task. * @@ -151,24 +120,8 @@ public class TaskAdapter extends Task implements TypeAdapter { Method executeM = null; try { Class c = proxy.getClass(); - final String methodName = getExecuteMethodName(); - executeM = c.getMethod(methodName, new Class[0]); - if (executeM == null) { - log("No public " + methodName + " in " + proxy.getClass(), - Project.MSG_ERR); - throw new BuildException("No public " + methodName + "() in " - + proxy.getClass()); - } - executeM.invoke(proxy, null); + DispatchUtils.execute(proxy); return; - } catch (java.lang.reflect.InvocationTargetException ie) { - log("Error in " + proxy.getClass(), Project.MSG_VERBOSE); - Throwable t = ie.getTargetException(); - if (t instanceof BuildException) { - throw ((BuildException) t); - } else { - throw new BuildException(t); - } } catch (Exception ex) { log("Error in " + proxy.getClass(), Project.MSG_VERBOSE); throw new BuildException(ex); diff --git a/src/main/org/apache/tools/ant/UnknownElement.java b/src/main/org/apache/tools/ant/UnknownElement.java index c75fe9b4f..e6b3713b2 100644 --- a/src/main/org/apache/tools/ant/UnknownElement.java +++ b/src/main/org/apache/tools/ant/UnknownElement.java @@ -391,7 +391,6 @@ public class UnknownElement extends Task { getProject()); String name = ue.getComponentName(); Object o = helper.createComponent(ue, ue.getNamespace(), name); - if (o == null) { throw getNotFoundException("task or type", name); } @@ -528,6 +527,16 @@ public class UnknownElement extends Task { public Object getRealThing() { return realThing; } + + /** + * Set the configured object + * + * @since ant 1.7 + */ + public void setRealThing(Object realThing) { + this.realThing = realThing; + } + /** * Try to create a nested element of parent for the * given tag. diff --git a/src/main/org/apache/tools/ant/dispatch/DispatchTask.java b/src/main/org/apache/tools/ant/dispatch/DispatchTask.java index e019b5ab4..15d3b173d 100644 --- a/src/main/org/apache/tools/ant/dispatch/DispatchTask.java +++ b/src/main/org/apache/tools/ant/dispatch/DispatchTask.java @@ -29,7 +29,7 @@ import org.apache.tools.ant.Task; * If the action attribute is not defined in the task or is empty, * the execute() method will be called. */ -public abstract class DispatchTask implements Dispatchable { +public abstract class DispatchTask extends Task implements Dispatchable { private String action; public String getActionParameterName() { diff --git a/src/main/org/apache/tools/ant/dispatch/DispatchUtils.java b/src/main/org/apache/tools/ant/dispatch/DispatchUtils.java new file mode 100644 index 000000000..c2488d59e --- /dev/null +++ b/src/main/org/apache/tools/ant/dispatch/DispatchUtils.java @@ -0,0 +1,113 @@ +/* + * Copyright 2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.dispatch; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.UnknownElement; +import org.apache.tools.ant.Task; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Determines and Executes the action method for the task + */ +public class DispatchUtils { + /** + * Determines and Executes the action method for the task + */ + public static final void execute(Object task) throws BuildException { + String methodName = "execute"; + Dispatchable dispatchable = null; + try { + if (task instanceof Dispatchable) { + dispatchable = (Dispatchable) task; + } else if (task instanceof UnknownElement) { + UnknownElement ue = (UnknownElement)task; + Object realThing = ue.getRealThing(); + if (realThing != null && realThing instanceof Dispatchable && realThing instanceof Task) { + dispatchable = (Dispatchable) realThing; + } + } + if (dispatchable != null) { + String mName = null; + try { + final String name = dispatchable.getActionParameterName(); + if (name != null && name.trim().length() > 0) { + mName = "get" + name.trim().substring(0, 1).toUpperCase(); + if (name.length() > 1) { + mName += name.substring(1); + } + final Class c = dispatchable.getClass(); + final Method actionM = c.getMethod(mName, new Class[0]); + if (actionM != null) { + final Object o = actionM.invoke(dispatchable, null); + if (o != null) { + final String s = o.toString(); + if (s != null && s.trim().length() > 0) { + methodName = s.trim(); + Method executeM = null; + executeM = dispatchable.getClass().getMethod(methodName, new Class[0]); + if (executeM == null) { + throw new BuildException("No public " + methodName + "() in " + + dispatchable.getClass()); + } + executeM.invoke(dispatchable, null); + if (task instanceof UnknownElement) { + ((UnknownElement) task).setRealThing(null); + } + } else { + throw new BuildException("Dispatchable Task attribute '" + name.trim() + + "' not set or value is empty."); + } + } else { + throw new BuildException("Dispatchable Task attribute '" + name.trim() + + "' not set or value is empty."); + } + } + } else { + throw new BuildException("Action Parameter Name must not be empty for Dispatchable Task."); + } + } catch (NoSuchMethodException nsme) { + throw new BuildException("No public " + mName + "() in " + task.getClass()); + } + } else { + Method executeM = null; + executeM = task.getClass().getMethod(methodName, new Class[0]); + if (executeM == null) { + throw new BuildException("No public " + methodName + "() in " + + task.getClass()); + } + executeM.invoke(task, null); + if (task instanceof UnknownElement) { + ((UnknownElement) task).setRealThing(null); + } + } + } catch(InvocationTargetException ie) { + Throwable t = ie.getTargetException(); + if (t instanceof BuildException) { + throw ((BuildException) t); + } else { + throw new BuildException(t); + } + } catch (NoSuchMethodException e) { + throw new BuildException(e); + } catch (IllegalAccessException e) { + throw new BuildException(e); + } + } +}