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