From b0bde5550598d2f86534bc0e599c0326caba90bd Mon Sep 17 00:00:00 2001 From: Costin Manolache Date: Thu, 27 Jan 2000 04:43:52 +0000 Subject: [PATCH] Added TaskAdapter - allows use of external Beans, without requiring them to extend Task or have any ideea that Ant will use them. The only requirement is to have a void execute() throws Exception That allows Tomcat ( and other projects) to define normal Beans and still be able to script them. The usage is identical with normal Task-extending Beans. Also fixed bootstrap.sh. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267576 13f79535-47bb-0310-9956-ffa450edef68 --- bootstrap.sh | 2 +- src/main/org/apache/tools/ant/Project.java | 16 ++- .../org/apache/tools/ant/ProjectHelper.java | 6 +- .../org/apache/tools/ant/TaskAdapter.java | 103 ++++++++++++++++++ 4 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 src/main/org/apache/tools/ant/TaskAdapter.java diff --git a/bootstrap.sh b/bootstrap.sh index b7e0c87db..a788b9927 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -5,7 +5,7 @@ fi SRCDIR=src/main/org/apache/tools/ant CLASSDIR=classes CLASSPATH=${CLASSPATH}:${JAVA_HOME}/lib/classes.zip:${JAVA_HOME}/lib/tools.jar -CLASSPATH=${CLASSPATH}:lib/xml.jar:src:${CLASSDIR} +CLASSPATH=${CLASSPATH}:lib/xml.jar:src/main:${CLASSDIR} mkdir -p ${CLASSDIR} diff --git a/src/main/org/apache/tools/ant/Project.java b/src/main/org/apache/tools/ant/Project.java index 6dfa153fd..1e5d6c4b3 100644 --- a/src/main/org/apache/tools/ant/Project.java +++ b/src/main/org/apache/tools/ant/Project.java @@ -334,13 +334,23 @@ public class Project { public Task createTask(String taskType) throws BuildException { Class c = (Class)taskClassDefinitions.get(taskType); - + // XXX // check for nulls, other sanity try { - Task task = (Task)c.newInstance(); - task.setProject(this); + Object o=c.newInstance(); + Task task = null; + if( o instanceof Task ) { + task=(Task)o; + } else { + // "Generic" Bean - use the setter pattern + // and an Adapter + TaskAdapter taskA=new TaskAdapter(); + taskA.setProxy( o ); + task=taskA; + } + task.setProject(this); String msg = " +Task: " + taskType; log (msg, MSG_VERBOSE); return task; diff --git a/src/main/org/apache/tools/ant/ProjectHelper.java b/src/main/org/apache/tools/ant/ProjectHelper.java index 6f4d43574..116d0cec7 100644 --- a/src/main/org/apache/tools/ant/ProjectHelper.java +++ b/src/main/org/apache/tools/ant/ProjectHelper.java @@ -231,10 +231,14 @@ public class ProjectHelper { } private static void configureTask(Project project, - Task task, + Task taskInst, NamedNodeMap nodeMap) throws BuildException { + Object task=taskInst; + if( task instanceof TaskAdapter ) + task=((TaskAdapter)task).getProxy(); + // XXX // instead of doing this introspection each time around, I // should have a helper class to keep this info around for diff --git a/src/main/org/apache/tools/ant/TaskAdapter.java b/src/main/org/apache/tools/ant/TaskAdapter.java new file mode 100644 index 000000000..9fa23ca0e --- /dev/null +++ b/src/main/org/apache/tools/ant/TaskAdapter.java @@ -0,0 +1,103 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 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", "Tomcat", 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 + * . + */ + +package org.apache.tools.ant; + +import org.apache.tools.ant.*; +import java.lang.reflect.*; +import java.util.*; + +/** + * Use introspection to "adapt" an arbitrary Bean ( not extending Task, but with similar + * patterns). + * + * @author costin@dnt.ro + */ +public class TaskAdapter extends Task { + + Object proxy; + + /** + * Do the execution. + */ + public void execute() throws BuildException { + Method executeM=null; + try { + Class c=proxy.getClass(); + executeM=c.getMethod( "execute", new Class[0] ); + if( executeM == null ) { + project.log("No execute in " + proxy.getClass(), "TaskAdapter", project.MSG_ERR); + throw new BuildException("No execute in " + proxy.getClass()); + } + executeM.invoke(proxy, null); + return; + } catch( Exception ex ) { + project.log("Error in " + proxy.getClass(), "TaskAdapter", project.MSG_ERR); + throw new BuildException( ex ); + } + + } + + /** + * Set the target object class + */ + public void setProxy(Object o) { + this.proxy = o; + } + + public Object getProxy() { + return this.proxy ; + } + +}