aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/manual/Tasks/script.html
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/manual/Tasks/script.html')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/manual/Tasks/script.html393
1 files changed, 393 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/manual/Tasks/script.html b/framework/src/ant/apache-ant-1.9.6/manual/Tasks/script.html
new file mode 100644
index 00000000..fb008224
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/manual/Tasks/script.html
@@ -0,0 +1,393 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us"></meta>
+<link rel="stylesheet" type="text/css" href="../stylesheets/style.css">
+<title>Script Task</title>
+</head>
+
+<body>
+
+<h2><a name="script">Script</a></h2>
+<h3>Description</h3>
+ <p>Execute a script in a
+ <a href="http://jakarta.apache.org/bsf" target="_top">Apache BSF</a>
+ or
+ <a href="https://scripting.dev.java.net">JSR 223</a> supported language.
+ </p>
+ <p><b>Note:</b>
+ This task depends on external libraries not included in the Apache Ant distribution.
+ See <a href="../install.html#librarydependencies">Library Dependencies</a>
+ for more information.
+ </p>
+ <p>
+ The task may use the BSF scripting manager or the JSR 223 manager that
+ is included in JDK6 and higher. This is controlled by the <code>manager</code>
+ attribute. The JSR 223 scripting manager is indicated by "javax".
+ </p>
+ <p>All items (tasks, targets, etc) of the running project are
+ 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>&lt;script&gt;</code>-Task instance.<br>From these objects you have access to the Ant Java API, see the
+<a href="../api/index.html">JavaDoc</a> (especially for
+<a href="../api/org/apache/tools/ant/Project.html">Project</a> and
+<a href="../api/org/apache/tools/ant/taskdefs/optional/Script.html">Script</a>) for more information.</p>
+<p>If you are using JavaScript under BSF, a good resource is <a target="_blank" href="http://www.mozilla.org/rhino/doc.html">
+http://www.mozilla.org/rhino/doc.html</a> as we are using their JavaScript interpreter.</p>
+<p>Scripts can do almost anything a task written in Java could do.</p>
+<p>Rhino provides a special construct - the <i>JavaAdapter</i>. With that you can
+create an object which implements several interfaces, extends classes and for which you
+can overwrite methods. Because this is an undocumented feature (yet), here is the link
+to an explanation: <a href="http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&newwindow=1&frame=right&th=610d2db45c0756bd&seekm=391EEC3C.5236D929%40yahoo.com#link2">
+Groups@Google: "Rhino, enum.js, JavaAdapter?"</a> by Norris Boyd in the newsgroup
+<i>netscape.public.mozilla.jseng</i>.</p>
+
+<p>If you are creating Targets programmatically, make sure you set the
+Location to a useful value. In particular all targets should have
+different location values.</p>
+
+<h3>Parameters</h3>
+<table border="1" cellpadding="2" cellspacing="0">
+ <tr>
+ <td valign="top"><b>Attribute</b></td>
+ <td valign="top"><b>Description</b></td>
+ <td align="center" valign="top"><b>Required</b></td>
+ </tr>
+ <tr>
+ <td valign="top">language</td>
+ <td valign="top">The programming language the script is written in.
+ Must be a supported Apache BSF or JSR 223 language</td>
+ <td valign="top" align="center">Yes</td>
+ </tr>
+ <tr>
+ <td valign="top">manager</td>
+ <td valign="top">
+ <em>Since: Ant 1.7. </em>
+ The script engine manager to use. This can have
+ one of three values ("auto", "bsf" or "javax").
+ The default value is "auto".
+ <dl>
+ <li>"bsf" use the BSF scripting manager to run
+ the language.</li>
+ <li>"javax" use the <em>javax.scripting</em> manager
+ to run the language. (This will only work for JDK6 and higher).</li>
+ <li>"auto" use the BSF engine if it exists,
+ otherwise use the <em>javax.scripting</em> manager.</li>
+ </dl>
+ </td>
+ <td valign="top" align="center">No</td>
+ </tr>
+ <tr>
+ <td valign="top">src</td>
+ <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>&lt;classpath&gt;</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 for BSF
+ or for JSR 223 managers.
+ This can be useful if one wants
+ to keep ${user.home}/.ant/lib free of lots of scripting language
+ specific jar files.
+ </p>
+ <p>
+ <b>NB: (Since Ant 1.7.1)</b>
+ This classpath <em>can</em> be used to
+ specify the location of
+ the BSF jar file and/or languages
+ that have engines in the BSF jar file. This includes the
+ javascript, jython, netrexx and jacl languages.
+ </p>
+</p>
+<h3>Examples</h3>
+The following snippet shows use of five different languages:
+ <blockquote><pre>
+ &lt;property name="message" value="Hello world"/&gt;
+
+ &lt;script language="groovy"&gt;
+ println("message is " + message)
+ &lt;/script&gt;
+
+ &lt;script language="beanshell"&gt;
+ System.out.println("message is " + message);
+ &lt;/script&gt;
+
+ &lt;script language="judoscript"&gt;
+ println 'message is ', message
+ &lt;/script&gt;
+
+ &lt;script language="ruby"&gt;
+ print 'message is ', $message, "\n"
+ &lt;/script&gt;
+
+ &lt;script language="jython"&gt;
+print "message is %s" % message
+ &lt;/script&gt;
+</pre>
+ </blockquote>
+ <p>
+ Note that for the <i>jython</i> example, the script contents <b>must</b>
+ 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>
+&lt;script language="ruby"&gt;
+ xmlfiles = Dir.new(".").entries.delete_if { |i| ! (i =~ /\.xml$/) }
+ xmlfiles.sort.each { |i| $self.log(i) }
+&lt;/script&gt;
+</pre>
+ </blockquote>
+ <p>
+ The same example in groovy is:
+ </p>
+ <blockquote><pre>
+&lt;script language="groovy"&gt;
+ xmlfiles = new java.io.File(".").listFiles().findAll{ it =~ "\.xml$"}
+ xmlfiles.sort().each { self.log(it.toString())}
+&lt;/script&gt;
+</pre>
+ </blockquote>
+ <p>
+ The following example shows the use of classpath to specify the location
+ of the beanshell jar file.
+ </p>
+ <blockquote><pre>
+&lt;script language="beanshell" setbeans="true"&gt;
+ &lt;classpath&gt;
+ &lt;fileset dir="${user.home}/lang/beanshell" includes="*.jar" /&gt;
+ &lt;/classpath&gt;
+ System.out.println("Hello world");
+&lt;/script&gt;
+</pre>
+ </blockquote>
+ <p>
+ The following script uses javascript to create a number of
+ echo tasks and execute them.
+ </p>
+<blockquote><pre>
+&lt;project name=&quot;squares&quot; default=&quot;main&quot; basedir=&quot;.&quot;&gt;
+
+ &lt;target name=&quot;main&quot;&gt;
+
+ &lt;script language=&quot;javascript&quot;&gt; &lt;![CDATA[
+
+ for (i=1; i&lt;=10; i++) {
+ echo = squares.createTask(&quot;echo&quot;);
+ echo.setMessage(i*i);
+ echo.perform();
+ }
+
+ ]]&gt; &lt;/script&gt;
+
+ &lt;/target&gt;
+
+&lt;/project&gt;
+</pre></blockquote>
+<p>generates</p>
+<blockquote><pre>
+main:
+1
+4
+9
+16
+25
+36
+49
+64
+81
+100
+
+BUILD SUCCESSFUL
+</pre></blockquote>
+
+<p>Now a more complex example using the Java API and the Ant API. The goal is to list the
+filesizes of all files a <code>&lt;fileset/&gt;</code> caught.</p>
+<blockquote><pre>
+
+&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
+&lt;project name="<font color=blue>MyProject</font>" basedir="." default="main"&gt;
+
+ &lt;property name="fs.dir" value="src"/&gt;
+ &lt;property name="fs.includes" value="**/*.txt"/&gt;
+ &lt;property name="fs.excludes" value="**/*.tmp"/&gt;
+
+ &lt;target name="main"&gt;
+ &lt;script language="javascript"&gt; &lt;![CDATA[
+
+ // import statements
+ <font color=blue>// importPackage(java.io)</font>;
+ <font color=blue>importClass(java.io.File)</font>;
+
+ // Access to Ant-Properties by their names
+ dir = <font color=blue>project</font>.getProperty("fs.dir");
+ includes = <font color=blue>MyProject</font>.getProperty("fs.includes");
+ excludes = <font color=blue>self.getProject()</font> .<font color=blue>getProperty("fs.excludes")</font>;
+
+ // Create a &lt;fileset dir="" includes=""/&gt;
+ fs = project.<font color=blue>createDataType("fileset")</font>;
+ fs.setDir( new File(dir) );
+ <font color=blue>fs.setIncludes(includes)</font>;
+ fs.setExcludes(excludes);
+
+ // Get the files (array) of that fileset
+ ds = fs.getDirectoryScanner(project);
+ srcFiles = ds.getIncludedFiles();
+
+ // iterate over that array
+ for (i=0; i&lt;srcFiles.length; i++) {
+
+ // get the values via Java API
+ var basedir = fs.getDir(project);
+ var filename = srcFiles[i];
+ var file = <font color=blue>new File(basedir, filename)</font>;
+ var size = file.length();
+
+ // create and use a Task via Ant API
+ echo = MyProject.<font color=blue>createTask("echo")</font>;
+ echo.setMessage(filename + ": " + size + " byte");
+ echo.<font color=blue>perform()</font>;
+ }
+ ]]&gt;&lt;/script&gt;
+ &lt;/target&gt;
+&lt;/project&gt;
+</pre></blockquote>
+<p>We want to use the Java API. Because we don't want always typing the package signature
+we do an import. Rhino knows two different methods for import statements: one for packages
+and one for a single class. By default only the <i>java</i> packages are available, so
+<i>java.lang.System</i> can be directly imported with <code>importClass/importPackage</code>.
+For other packages you have to prefix the full classified name with <i>Packages</i>.
+For example Ant's <i>FileUtils</i> class can be imported with
+<code>importClass(<b>Packages</b>.org.apache.tools.ant.util.FileUtils)</code>
+<br>
+The <code>&lt;script&gt;</code> task populates the Project instance under
+the name <i>project</i>, so we can use that reference. Another way is to use its given name
+or getting its reference from the task itself.<br>
+The Project provides methods for accessing and setting properties, creating DataTypes and
+Tasks and much more.<br>
+After creating a FileSet object we initialize that by calling its set-methods. Then we can
+use that object like a normal Ant task (<code>&lt;copy&gt;</code> for example).<br>
+For getting the size of a file we instantiate a <code>java.io.File</code>. So we are using
+normal Java API here.<br>
+Finally we use the <code>&lt;echo&gt;</code> task for producing the output. The task is not executed by
+its execute() method, because the perform() method (implemented in Task itself) does the
+appropriate logging before and after invoking execute().
+</p>
+<p>
+ Here is an example of using beanshell to create an ant
+ task. This task will add filesets and paths to a referenced
+ path. If the path does not exist, it will be created.
+</p>
+<blockquote><pre>
+&lt;!--
+ Define addtopath task
+ --&gt;
+&lt;script language="beanshell"&gt;
+ import org.apache.tools.ant.Task;
+ import org.apache.tools.ant.types.Path;
+ import org.apache.tools.ant.types.FileSet;
+ public class AddToPath extends Task {
+ private Path path;
+ public void setRefId(String id) {
+ path = getProject().getReference(id);
+ if (path == null) {
+ path = new Path(getProject());
+ getProject().addReference(id, path);
+ }
+ }
+ public void add(Path c) {
+ path.add(c);
+ }
+ public void add(FileSet c) {
+ path.add(c);
+ }
+ public void execute() {
+ // Do nothing
+ }
+ }
+ project.addTaskDefinition("addtopath", AddToPath.class);
+&lt;/script&gt;
+</pre></blockquote>
+ <p>
+ An example of using this task to create a path
+ from a list of directories (using antcontrib's
+ <a href="http://ant-contrib.sourceforge.net/tasks/tasks/for.html">
+ &lt;for&gt;</a> task) follows:
+ </p>
+<blockquote><pre>
+&lt;path id="main.path"&gt;
+ &lt;fileset dir="build/classes"/&gt;
+&lt;/path&gt;
+&lt;ac:for param="ref" list="commons,fw,lps"
+ xmlns:ac="antlib:net.sf.antcontrib"&gt;
+ &lt;sequential&gt;
+ &lt;addtopath refid="main.path"&gt;
+ &lt;fileset dir="${dist.dir}/@{ref}/main"
+ includes="**/*.jar"/&gt;
+ &lt;/addtopath&gt;
+ &lt;/sequential&gt;
+&lt;/ac:for&gt;
+</pre></blockquote>
+
+</body>
+</html>