This is not organized as a 'project' - the files here needs to replace the ones in the main tree. I'll probably import the rest of the core and make it a standalone replacement, so it's easy to review. The goals are to: - make ant more 'embeddable' - integrate it better in other tools - support SAX2 and namespaces - support pluggable behavior for the XML reader - support pluggable task factories - the factory will have full control over the class loader - better support and integration with existing java beans. All that while maintaining full compatibility with ant1.4 - all the code here is just an additional set of hooks, with the previous behavior preserved and remaining as default. Eventually this can be refactored into a standalone component that will implement a task engine for ant1.x. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271572 13f79535-47bb-0310-9956-ffa450edef68master
@@ -56,11 +56,10 @@ package org.apache.tools.ant; | |||||
import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||
/** | /** | ||||
* Use introspection to "adapt" an arbitrary Bean ( not extending Task, but with similar | |||||
* patterns). | |||||
* Uses introspection to "adapt" an arbitrary Bean which doesn't | |||||
* itself extend Task, but still contains an execute method and optionally | |||||
* a setProject method. | |||||
* | * | ||||
* The adapter can also be used to wrap tasks that are loaded in a different class loader | * The adapter can also be used to wrap tasks that are loaded in a different class loader | ||||
* by ant, when used in programatic mode. | * by ant, when used in programatic mode. | ||||
@@ -69,19 +68,28 @@ import java.lang.reflect.Method; | |||||
*/ | */ | ||||
public class TaskAdapter extends Task { | public class TaskAdapter extends Task { | ||||
/** Object to act as a proxy for. */ | |||||
private Object proxy; | private Object proxy; | ||||
private String methodName="execute"; | private String methodName="execute"; | ||||
Object proxy; | |||||
/** | /** | ||||
* Checks a class, whether it is suitable to be adapted by TaskAdapter. | |||||
* Checks whether or not a class is suitable to be adapted by TaskAdapter. | |||||
* | * | ||||
* Checks conditions only, which are additionally required for a tasks | |||||
* adapted by TaskAdapter. Thus, this method should be called by | |||||
* {@link Project#checkTaskClass}. | |||||
* This only checks conditions which are additionally required for | |||||
* tasks adapted by TaskAdapter. Thus, this method should be called by | |||||
* Project.checkTaskClass. | |||||
* | * | ||||
* Throws a BuildException and logs as Project.MSG_ERR for | * Throws a BuildException and logs as Project.MSG_ERR for | ||||
* conditions, that will cause the task execution to fail. | |||||
* conditions that will cause the task execution to fail. | |||||
* Logs other suspicious conditions with Project.MSG_WARN. | * Logs other suspicious conditions with Project.MSG_WARN. | ||||
* | |||||
* @param taskClass Class to test for suitability. | |||||
* Must not be <code>null</code>. | |||||
* @param project Project to log warnings/errors to. | |||||
* Must not be <code>null</code>. | |||||
* | |||||
* @see Project#checkTaskClass(Class) | |||||
*/ | */ | ||||
public static void checkTaskClass(final Class taskClass, final Project project) { | public static void checkTaskClass(final Class taskClass, final Project project) { | ||||
// Any task can be used via adapter. If it doesn't have any execute() | // Any task can be used via adapter. If it doesn't have any execute() | ||||
@@ -154,7 +162,7 @@ public class TaskAdapter extends Task { | |||||
} | } | ||||
/** | /** | ||||
* Do the execution. | |||||
* Executes the proxied task. | |||||
*/ | */ | ||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
Method setProjectM = null; | Method setProjectM = null; | ||||
@@ -201,12 +209,19 @@ public class TaskAdapter extends Task { | |||||
} | } | ||||
/** | /** | ||||
* Set the target object class | |||||
* Sets the target object to proxy for. | |||||
* | |||||
* @param o The target object. Must not be <code>null</code>. | |||||
*/ | */ | ||||
public void setProxy(Object o) { | public void setProxy(Object o) { | ||||
this.proxy = o; | this.proxy = o; | ||||
} | } | ||||
/** | |||||
* Returns the target object being proxied. | |||||
* | |||||
* @return the target proxy object | |||||
*/ | |||||
public Object getProxy() { | public Object getProxy() { | ||||
return this.proxy ; | return this.proxy ; | ||||
} | } | ||||
@@ -0,0 +1,95 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant; | |||||
import java.io.File; | |||||
import java.io.InputStream; | |||||
import java.io.IOException; | |||||
import java.util.Hashtable; | |||||
import java.util.Vector; | |||||
import java.util.Properties; | |||||
import java.util.Enumeration; | |||||
import java.util.Stack; | |||||
import java.lang.reflect.Modifier; | |||||
import org.apache.tools.ant.types.FilterSet; | |||||
import org.apache.tools.ant.types.FilterSetCollection; | |||||
import org.apache.tools.ant.util.FileUtils; | |||||
/** | |||||
* Create tasks. Multiple task factories can be enabled at | |||||
* any time. The common 'Chain' pattern is used to construct | |||||
* tasks, with the original behavior ( Class ) tried last. | |||||
* | |||||
* @author Costin Manolache | |||||
*/ | |||||
public interface TaskFactory { | |||||
/** Creates or get a previously created task. | |||||
* | |||||
* The task factory can be registered with the Project by a Task or by an | |||||
* application embedding ant. | |||||
* | |||||
* A factory may have knowledge about the tasks it creates. It can return | |||||
* an object extending TaskAdapter that emulates Task on it's adapter. | |||||
* | |||||
* @param project the context for task creation. | |||||
* @param ns namespace ( for use with SAX2 projects ). | |||||
* @param taskName the name of the task. | |||||
*/ | |||||
public Task createTask( Project project, String ns, String taskName ) | |||||
throws BuildException; | |||||
} |