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]