umagesh 2004/06/06 10:31:50
Modified: src/main/org/apache/tools/ant TaskAdapter.java
Log:
Tasks extending from abstract DispatchTask may have multiple action methods
that will get invoked depending upon the action attribute of the task.
Revision Changes Path
1.29 +62 -23 ant/src/main/org/apache/tools/ant/TaskAdapter.java
Index: TaskAdapter.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/TaskAdapter.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- TaskAdapter.java 9 Mar 2004 16:47:59 -0000 1.28
+++ TaskAdapter.java 6 Jun 2004 17:31:50 -0000 1.29
@@ -17,7 +17,9 @@
package org.apache.tools.ant;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import org.apache.tools.ant.dispatch.Dispatchable;
/**
* Uses introspection to "adapt" an arbitrary Bean which doesn't
@@ -32,6 +34,9 @@
/**
* Checks whether or not a class is suitable to be adapted by
TaskAdapter.
+ * If the class is of type Dispatchable, the check is not performed
because
+ * the method that will be executed will be determined only at runtime of
+ * the actual task and not during parse time.
*
* This only checks conditions which are additionally required for
* tasks adapted by TaskAdapter. Thus, this method should be called by
@@ -50,28 +55,30 @@
*/
public static void checkTaskClass(final Class taskClass,
final Project project) {
- // don't have to check for interface, since then
- // taskClass would be abstract too.
- try {
- final Method executeM = taskClass.getMethod("execute", null);
- // don't have to check for public, since
- // getMethod finds public method only.
- // don't have to check for abstract, since then
+ if (!Dispatchable.class.isAssignableFrom(taskClass)) {
+ // don't have to check for interface, since then
// taskClass would be abstract too.
- if (!Void.TYPE.equals(executeM.getReturnType())) {
- final String message = "return type of execute() should be "
- + "void but was \"" + executeM.getReturnType() + "\" in "
- + taskClass;
- project.log(message, Project.MSG_WARN);
+ try {
+ final Method executeM = taskClass.getMethod("execute", null);
+ // don't have to check for public, since
+ // getMethod finds public method only.
+ // don't have to check for abstract, since then
+ // taskClass would be abstract too.
+ if (!Void.TYPE.equals(executeM.getReturnType())) {
+ final String message = "return type of execute() should
be "
+ + "void but was \"" + executeM.getReturnType() + "\"
in "
+ + taskClass;
+ project.log(message, Project.MSG_WARN);
+ }
+ } catch (NoSuchMethodException e) {
+ final String message = "No public execute() in " + taskClass;
+ project.log(message, Project.MSG_ERR);
+ throw new BuildException(message);
+ } catch (LinkageError e) {
+ String message = "Could not load " + taskClass + ": " + e;
+ project.log(message, Project.MSG_ERR);
+ throw new BuildException(message, e);
}
- } catch (NoSuchMethodException e) {
- final String message = "No public execute() in " + taskClass;
- project.log(message, Project.MSG_ERR);
- throw new BuildException(message);
- } catch (LinkageError e) {
- String message = "Could not load " + taskClass + ": " + e;
- project.log(message, Project.MSG_ERR);
- throw new BuildException(message, e);
}
}
@@ -86,6 +93,37 @@
}
/**
+ * 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.
*
* @exception BuildException if the project could not be set
@@ -113,11 +151,12 @@
Method executeM = null;
try {
Class c = proxy.getClass();
- executeM = c.getMethod("execute", new Class[0]);
+ final String methodName = getExecuteMethodName();
+ executeM = c.getMethod(methodName, new Class[0]);
if (executeM == null) {
- log("No public execute() in " + proxy.getClass(),
+ log("No public " + methodName + " in " + proxy.getClass(),
Project.MSG_ERR);
- throw new BuildException("No public execute() in "
+ throw new BuildException("No public " + methodName + "() in "
+ proxy.getClass());
}
executeM.invoke(proxy, null);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]