git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276560 13f79535-47bb-0310-9956-ffa450edef68master
@@ -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()); | |||
@@ -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); | |||
@@ -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 <code>parent</code> for the | |||
* 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, | |||
* 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() { | |||
@@ -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); | |||
} | |||
} | |||
} |