mirror of
https://github.com/apache/ant.git
synced 2025-05-19 06:24:47 +00:00
Tasks extending from oata.Task and implementing Dispatchable are not dispatchable.
git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276560 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4010e0a25d
commit
63c0593a82
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
package org.apache.tools.ant;
|
package org.apache.tools.ant;
|
||||||
|
|
||||||
|
import org.apache.tools.ant.dispatch.DispatchUtils;
|
||||||
|
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -361,7 +363,7 @@ public abstract class Task extends ProjectComponent {
|
|||||||
Throwable reason = null;
|
Throwable reason = null;
|
||||||
try {
|
try {
|
||||||
maybeConfigure();
|
maybeConfigure();
|
||||||
execute();
|
DispatchUtils.execute(this);
|
||||||
} catch (BuildException ex) {
|
} catch (BuildException ex) {
|
||||||
if (ex.getLocation() == Location.UNKNOWN_LOCATION) {
|
if (ex.getLocation() == Location.UNKNOWN_LOCATION) {
|
||||||
ex.setLocation(getLocation());
|
ex.setLocation(getLocation());
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
package org.apache.tools.ant;
|
package org.apache.tools.ant;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import org.apache.tools.ant.dispatch.Dispatchable;
|
import org.apache.tools.ant.dispatch.Dispatchable;
|
||||||
|
import org.apache.tools.ant.dispatch.DispatchUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses introspection to "adapt" an arbitrary Bean which doesn't
|
* Uses introspection to "adapt" an arbitrary Bean which doesn't
|
||||||
@ -92,37 +92,6 @@ public class TaskAdapter extends Task implements TypeAdapter {
|
|||||||
checkTaskClass(proxyClass, getProject());
|
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.
|
* Executes the proxied task.
|
||||||
*
|
*
|
||||||
@ -151,24 +120,8 @@ public class TaskAdapter extends Task implements TypeAdapter {
|
|||||||
Method executeM = null;
|
Method executeM = null;
|
||||||
try {
|
try {
|
||||||
Class c = proxy.getClass();
|
Class c = proxy.getClass();
|
||||||
final String methodName = getExecuteMethodName();
|
DispatchUtils.execute(proxy);
|
||||||
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);
|
|
||||||
return;
|
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) {
|
} catch (Exception ex) {
|
||||||
log("Error in " + proxy.getClass(), Project.MSG_VERBOSE);
|
log("Error in " + proxy.getClass(), Project.MSG_VERBOSE);
|
||||||
throw new BuildException(ex);
|
throw new BuildException(ex);
|
||||||
|
@ -391,7 +391,6 @@ public class UnknownElement extends Task {
|
|||||||
getProject());
|
getProject());
|
||||||
String name = ue.getComponentName();
|
String name = ue.getComponentName();
|
||||||
Object o = helper.createComponent(ue, ue.getNamespace(), name);
|
Object o = helper.createComponent(ue, ue.getNamespace(), name);
|
||||||
|
|
||||||
if (o == null) {
|
if (o == null) {
|
||||||
throw getNotFoundException("task or type", name);
|
throw getNotFoundException("task or type", name);
|
||||||
}
|
}
|
||||||
@ -528,6 +527,16 @@ public class UnknownElement extends Task {
|
|||||||
public Object getRealThing() {
|
public Object getRealThing() {
|
||||||
return realThing;
|
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 <code>parent</code> for the
|
* Try to create a nested element of <code>parent</code> for the
|
||||||
* given tag.
|
* given tag.
|
||||||
|
@ -29,7 +29,7 @@ import org.apache.tools.ant.Task;
|
|||||||
* If the action attribute is not defined in the task or is empty,
|
* If the action attribute is not defined in the task or is empty,
|
||||||
* the execute() method will be called.
|
* the execute() method will be called.
|
||||||
*/
|
*/
|
||||||
public abstract class DispatchTask implements Dispatchable {
|
public abstract class DispatchTask extends Task implements Dispatchable {
|
||||||
private String action;
|
private String action;
|
||||||
|
|
||||||
public String getActionParameterName() {
|
public String getActionParameterName() {
|
||||||
|
113
src/main/org/apache/tools/ant/dispatch/DispatchUtils.java
Normal file
113
src/main/org/apache/tools/ant/dispatch/DispatchUtils.java
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user