to be executed. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267636 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -28,6 +28,8 @@ | |||||
| <property name="build.compiler" value="classic"/> | <property name="build.compiler" value="classic"/> | ||||
| <available property="bsf.present" classname="com.ibm.bsf.BSFManager" /> | |||||
| <!-- Give user a chance to override without editing this file | <!-- Give user a chance to override without editing this file | ||||
| (and without typing -D each time it compiles it --> | (and without typing -D each time it compiles it --> | ||||
| <property file="${user.home}/.ant.properties" /> | <property file="${user.home}/.ant.properties" /> | ||||
| @@ -50,8 +52,9 @@ | |||||
| classpath="${classpath}" | classpath="${classpath}" | ||||
| debug="on" | debug="on" | ||||
| deprecation="on" | deprecation="on" | ||||
| optimize="on" | |||||
| /> | |||||
| optimize="on" > | |||||
| <exclude name="**/Script.java" unless="bsf.present" /> | |||||
| </javac> | |||||
| </target> | </target> | ||||
| <!-- =================================================================== --> | <!-- =================================================================== --> | ||||
| @@ -98,6 +98,7 @@ public class Project { | |||||
| private Hashtable properties = new Hashtable(); | private Hashtable properties = new Hashtable(); | ||||
| private Hashtable userProperties = new Hashtable(); | private Hashtable userProperties = new Hashtable(); | ||||
| private Hashtable references = new Hashtable(); | |||||
| private String defaultTarget; | private String defaultTarget; | ||||
| private Hashtable taskClassDefinitions = new Hashtable(); | private Hashtable taskClassDefinitions = new Hashtable(); | ||||
| private Hashtable targets = new Hashtable(); | private Hashtable targets = new Hashtable(); | ||||
| @@ -773,4 +774,12 @@ public class Project { | |||||
| } while(!c.equals(end)); | } while(!c.equals(end)); | ||||
| return new BuildException(new String(sb)); | return new BuildException(new String(sb)); | ||||
| } | } | ||||
| public void addReference(String name, Object value) { | |||||
| references.put(name,value); | |||||
| } | |||||
| public Hashtable getReferences() { | |||||
| return references; | |||||
| } | |||||
| } | } | ||||
| @@ -137,6 +137,7 @@ public class ProjectHelper { | |||||
| String targetName = element.getAttribute("name"); | String targetName = element.getAttribute("name"); | ||||
| String targetDep = element.getAttribute("depends"); | String targetDep = element.getAttribute("depends"); | ||||
| String targetCond = element.getAttribute("if"); | String targetCond = element.getAttribute("if"); | ||||
| String targetId = element.getAttribute("id"); | |||||
| // all targets must have a name | // all targets must have a name | ||||
| if (targetName.equals("")) { | if (targetName.equals("")) { | ||||
| @@ -149,6 +150,9 @@ public class ProjectHelper { | |||||
| target.setCondition(targetCond); | target.setCondition(targetCond); | ||||
| project.addTarget(targetName, target); | project.addTarget(targetName, target); | ||||
| if (targetId != null && !targetId.equals("")) | |||||
| project.addReference(targetId,target); | |||||
| // take care of dependencies | // take care of dependencies | ||||
| if (targetDep.length() > 0) { | if (targetDep.length() > 0) { | ||||
| @@ -214,6 +218,23 @@ public class ProjectHelper { | |||||
| // right now, all we are interested in is element nodes | // right now, all we are interested in is element nodes | ||||
| // not quite sure what to do with others except drop 'em | // not quite sure what to do with others except drop 'em | ||||
| if (node.getNodeType() == Node.TEXT_NODE) { | |||||
| String text = ((Text)node).getData(); | |||||
| try { | |||||
| Method addProp = targetClass.getMethod( | |||||
| "addText", new Class[]{"".getClass()}); | |||||
| Object child = addProp.invoke(target, new Object[] {text}); | |||||
| } catch (NoSuchMethodException nsme) { | |||||
| if (text.trim().length() > 0) | |||||
| throw new BuildException(targetClass + | |||||
| " does not support nested text elements"); | |||||
| } catch (InvocationTargetException ite) { | |||||
| throw new BuildException(ite.getMessage()); | |||||
| } catch (IllegalAccessException iae) { | |||||
| throw new BuildException(iae.getMessage()); | |||||
| } | |||||
| } | |||||
| if (node.getNodeType() == Node.ELEMENT_NODE) { | if (node.getNodeType() == Node.ELEMENT_NODE) { | ||||
| Element element = (Element)node; | Element element = (Element)node; | ||||
| String propType = element.getTagName(); | String propType = element.getTagName(); | ||||
| @@ -299,6 +320,11 @@ public class ProjectHelper { | |||||
| Method setMethod = (Method)propertySetters.get(attr.getName()); | Method setMethod = (Method)propertySetters.get(attr.getName()); | ||||
| if (setMethod == null) { | if (setMethod == null) { | ||||
| if (attr.getName().equals("id")) { | |||||
| project.addReference(attr.getValue(), target); | |||||
| continue; | |||||
| } | |||||
| String msg = "Configuration property \"" + attr.getName() + | String msg = "Configuration property \"" + attr.getName() + | ||||
| "\" does not have a setMethod in " + target.getClass(); | "\" does not have a setMethod in " + target.getClass(); | ||||
| throw new BuildException(msg); | throw new BuildException(msg); | ||||
| @@ -27,6 +27,9 @@ available=org.apache.tools.ant.taskdefs.Available | |||||
| filter=org.apache.tools.ant.taskdefs.Filter | filter=org.apache.tools.ant.taskdefs.Filter | ||||
| fixcrlf=org.apache.tools.ant.taskdefs.FixCRLF | fixcrlf=org.apache.tools.ant.taskdefs.FixCRLF | ||||
| # optional tasks | |||||
| script=org.apache.tools.ant.taskdefs.optional.Script | |||||
| # deprecated ant tasks (kept for back compatibility) | # deprecated ant tasks (kept for back compatibility) | ||||
| javadoc2=org.apache.tools.ant.taskdefs.Javadoc | javadoc2=org.apache.tools.ant.taskdefs.Javadoc | ||||
| keysubst=org.apache.tools.ant.taskdefs.KeySubst | keysubst=org.apache.tools.ant.taskdefs.KeySubst | ||||
| @@ -0,0 +1,148 @@ | |||||
| /* | |||||
| * 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 | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.optional; | |||||
| import org.apache.tools.ant.*; | |||||
| import java.io.*; | |||||
| import java.util.*; | |||||
| import com.ibm.bsf.*; | |||||
| /** | |||||
| * Execute a script | |||||
| * | |||||
| * @author Sam Ruby <a href="mailto:rubys@us.ibm.com">rubys@us.ibm.com</a> | |||||
| */ | |||||
| public class Script extends Task { | |||||
| private String language; | |||||
| private String script = ""; | |||||
| /** | |||||
| * Do the work. | |||||
| * | |||||
| * @exception BuildException if someting goes wrong with the build | |||||
| */ | |||||
| public void execute() throws BuildException { | |||||
| BSFManager manager = new BSFManager (); | |||||
| try { | |||||
| // add id references (<task id="foo">) | |||||
| Hashtable references = project.getReferences(); | |||||
| for (Enumeration e = references.keys() ; e.hasMoreElements() ;) { | |||||
| String key = (String)e.nextElement(); | |||||
| Object value = references.get(key); | |||||
| manager.declareBean(key, value, value.getClass()); | |||||
| } | |||||
| // add properties (<property name="foo">) | |||||
| Hashtable properties = project.getProperties(); | |||||
| for (Enumeration e = properties.keys() ; e.hasMoreElements() ;) { | |||||
| String key = (String)e.nextElement(); | |||||
| if (!references.contains(key)) { | |||||
| Object value = properties.get(key); | |||||
| manager.declareBean(key, value, value.getClass()); | |||||
| } | |||||
| } | |||||
| // execute the script | |||||
| manager.exec(language, "<ANT>", 0, 0, script); | |||||
| } catch (BSFException be) { | |||||
| Exception e = be; | |||||
| Throwable te = be.getTargetException(); | |||||
| if (te != null && te instanceof Exception) e = (Exception) te; | |||||
| throw new BuildException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Defines the language (required). | |||||
| * | |||||
| * @param msg Sets the value for the script variable. | |||||
| */ | |||||
| public void setLanguage(String language) { | |||||
| this.language = language; | |||||
| } | |||||
| /** | |||||
| * Load the script from an external file | |||||
| * | |||||
| * @param msg Sets the value for the script variable. | |||||
| */ | |||||
| public void setSrc(String fileName) { | |||||
| File file = new File(fileName); | |||||
| if (!file.exists()) | |||||
| throw new BuildException("file " + fileName + " not found."); | |||||
| int count = (int)file.length(); | |||||
| byte data[] = new byte[count]; | |||||
| try { | |||||
| FileInputStream inStream = new FileInputStream(file); | |||||
| inStream.read(data); | |||||
| inStream.close(); | |||||
| } catch (IOException e) { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| script += new String(data); | |||||
| } | |||||
| /** | |||||
| * Defines the script. | |||||
| * | |||||
| * @param msg Sets the value for the script variable. | |||||
| */ | |||||
| public void addText(String text) { | |||||
| this.script += text; | |||||
| } | |||||
| } | |||||