Author: peterreilly Date: Sat Sep 2 16:11:04 2006 New Revision: 439681 URL: http://svn.apache.org/viewvc?rev=439681&view=rev Log: add setbeans and classpath to <script> task
Modified: ant/core/trunk/WHATSNEW ant/core/trunk/docs/manual/OptionalTasks/script.html ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Script.java ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunner.java Modified: ant/core/trunk/WHATSNEW URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=439681&r1=439680&r2=439681&view=diff ============================================================================== --- ant/core/trunk/WHATSNEW (original) +++ ant/core/trunk/WHATSNEW Sat Sep 2 16:11:04 2006 @@ -4,6 +4,8 @@ Changes that could break older environments: ------------------------------------------- +* <script> and <scriptdef> now set the current thread context. + Fixed bugs: ----------- @@ -13,6 +15,13 @@ Other changes: -------------- + +* added setbeans attribute to <script> to allow <script>'s to be + run without referencing all references. + Bugzilla report 37688. +* added classpath attribute and nested element to <script> to allow + the language jars to be specified in the build script. + Bugzilla report 29676. Changes from Ant 1.6.5 to Ant 1.7.0Beta1 ======================================== Modified: ant/core/trunk/docs/manual/OptionalTasks/script.html URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/OptionalTasks/script.html?rev=439681&r1=439680&r2=439681&view=diff ============================================================================== --- ant/core/trunk/docs/manual/OptionalTasks/script.html (original) +++ ant/core/trunk/docs/manual/OptionalTasks/script.html Sat Sep 2 16:11:04 2006 @@ -18,6 +18,7 @@ accessible from the script, using either their <code>name</code> or <code>id</code> attributes (as long as their names are considered valid Java identifiers, that is). +This is controlled by the "setbeans" attribute of the task. The name "project" is a pre-defined reference to the Project, which can be used instead of the project name. The name "self" is a pre-defined reference to the actual <code><script></code>-Task instance.<br>From these objects you have access to the Ant Java API, see the @@ -54,7 +55,50 @@ <td valign="top">The location of the script as a file, if not inline</td> <td valign="top" align="center">No</td> </tr> + <tr> + <td valign="top">setbeans</td> + <td valign="top"> + This attribute controls whether to set variables for + all properties, references and targets in the running script. + If this attribute is false, only the the "project" and "self" variables are set. + If this attribute is true all the variables are set. The default value of this + attribute is "true". <em>Since Ant 1.7</em> + </td> + <td valign="top" align="center">No</td> + </tr> + <tr> + <td valign="top">classpath</td> + <td valign="top"> + The classpath to pass into the script. <em>Since Ant 1.7</em> + </td> + <td align="center" valign="top">No</td> + </tr> + <tr> + <td valign="top">classpathref</td> + <td valign="top">The classpath to use, given as a + <a href="../using.html#references">reference</a> to a path defined elsewhere. + <em>Since Ant 1.7</em></td> + <td align="center" valign="top">No</td> + </tr> </table> +<h3>Parameters specified as nested elements</h3> +<h4>classpath</h4> + <p><em>Since Ant 1.7</em></p> +<p> + <code>Script</code>'s <code>classpath</code> attribute is a + <a href="../using.html#path">path-like structure</a> and can also be set via a nested + <code><classpath></code> element. + <p> + If a classpath is set, it will be used as the current thread context classloader, and + as the classloader given to the BSF manager. This means that it can be used to specify + the classpath containing the language implementation. This can be usefull if one wants + to keep ${user.home}/.ant/lib free of lots of scripting language specific jar files. + </p> + <p> + <b>NB:</b> This classpath cannot (currently) be used to specify the location of + the BSF jar file. + </p> +</p> <h3>Examples</h3> The following snippet shows use of five different languages: <blockquote><pre> @@ -86,6 +130,9 @@ start on the first column. </p> <p> + Note also that for the <i>ruby</i> example, the names of the set variables are prefixed + by a '$'. + <p> The following script shows a little more complicated jruby example: </p> <blockquote><pre> @@ -106,6 +153,19 @@ </pre> </blockquote> <p> + The following example shows the use of classpath to specify the location + of the beanshell jar file. + </p> + <blockquote><pre> +<script language="beanshell" setbeans="true"> + <classpath> + <fileset dir="${user.home}/lang/beanshell" includes="*.jar" /> + </classpath> + System.out.println("Hello world"); +</script> +</pre> + </blockquote> + <p> The following script uses javascript to create a number of echo tasks and execute them. </p> @@ -257,7 +317,7 @@ <hr> -<p align="center">Copyright © 2000-2005 The Apache Software Foundation. All rights +<p align="center">Copyright © 2000-2006 The Apache Software Foundation. All rights Reserved.</p> </body> Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Script.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Script.java?rev=439681&r1=439680&r2=439681&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Script.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Script.java Sat Sep 2 16:11:04 2006 @@ -21,6 +21,8 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.util.ScriptRunner; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.Reference; /** * Executes a script. @@ -29,9 +31,11 @@ */ public class Script extends Task { - private String language; - private File src; - private String text; + private Path classpath; + private String language; + private File src; + private String text; + private boolean setBeans = true; /** * Do the work. @@ -49,8 +53,14 @@ if (text != null) { runner.addText(text); } - - runner.bindToComponent(this); + if (classpath != null) { + runner.setClasspath(classpath); + } + if (setBeans) { + runner.bindToComponent(this); + } else { + runner.bindToComponentMinimum(this); + } runner.executeScript("ANT"); } @@ -80,5 +90,50 @@ */ public void addText(String text) { this.text = text; + } + + /** + * Set the classpath to be used when searching for classes and resources. + * + * @param classpath an Ant Path object containing the search path. + */ + public void setClasspath(Path classpath) { + createClasspath().append(classpath); + } + + /** + * Classpath to be used when searching for classes and resources. + * + * @return an empty Path instance to be configured by Ant. + */ + public Path createClasspath() { + if (this.classpath == null) { + this.classpath = new Path(getProject()); + } + return this.classpath.createPath(); + } + + /** + * Set the classpath by reference. + * + * @param r a Reference to a Path instance to be used as the classpath + * value. + */ + public void setClasspathRef(Reference r) { + createClasspath().setRefid(r); + } + + /** + * Set the setbeans attribute. + * If this is true, <script> will create variables in the + * script instance for all + * properties, targets and references of the current project. + * It this is false, only the project and self variables will + * be set. + * The default is true. + * @param setBeans the value to set. + */ + public void setSetBeans(boolean setBeans) { + this.setBeans = setBeans; } } Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunner.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunner.java?rev=439681&r1=439680&r2=439681&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunner.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/util/ScriptRunner.java Sat Sep 2 16:11:04 2006 @@ -20,8 +20,11 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; + import org.apache.bsf.BSFException; import org.apache.bsf.BSFManager; + +import org.apache.tools.ant.AntClassLoader; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.ProjectComponent; import org.apache.tools.ant.Project; @@ -29,6 +32,7 @@ import java.util.Map; import java.util.HashMap; import java.util.Iterator; +import org.apache.tools.ant.types.Path; /** * This class is used to run BSF scripts @@ -57,6 +61,11 @@ /** Beans to be provided to the script */ private Map beans = new HashMap(); + /** Classpath to be used when running the script. */ + private Path classpath = null; + + /** Project this runner is used in */ + private Project project = null; /** * Add a list of named objects to the list to be exported to the script @@ -111,8 +120,18 @@ throw new BuildException("script language must be specified"); } + ClassLoader origContextClassLoader = + Thread.currentThread().getContextClassLoader(); + ClassLoader scriptLoader = getClass().getClassLoader(); + if (classpath != null && project != null) { + AntClassLoader loader = project.createClassLoader(classpath); + loader.setParent(scriptLoader); + scriptLoader = loader; + } try { + Thread.currentThread().setContextClassLoader(scriptLoader); BSFManager manager = new BSFManager (); + manager.setClassLoader(scriptLoader); for (Iterator i = beans.keySet().iterator(); i.hasNext();) { String key = (String) i.next(); @@ -141,6 +160,9 @@ } } throw new BuildException(t); + } finally { + Thread.currentThread().setContextClassLoader( + origContextClassLoader); } } @@ -163,6 +185,13 @@ } /** + * Set the class path to be used. + */ + public void setClasspath(Path classpath) { + this.classpath = classpath; + } + + /** * Load the script from an external file ; optional. * * @param file the file containing the script source. @@ -203,11 +232,22 @@ * @param component to become <code>self</code> */ public void bindToComponent(ProjectComponent component) { - Project project = component.getProject(); + project = component.getProject(); addBeans(project.getProperties()); addBeans(project.getUserProperties()); addBeans(project.getTargets()); addBeans(project.getReferences()); + addBean("project", project); + addBean("self", component); + } + + /** + * Bind the runner to a project component. + * The project and self are the only beans set. + * @param component to become <code>self</code> + */ + public void bindToComponentMinimum(ProjectComponent component) { + project = component.getProject(); addBean("project", project); addBean("self", component); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]