git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277368 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1537,6 +1537,10 @@ | |||
unless="bsf.present"/> | |||
<exclude name="${optional.package}/BeanShellScriptTest.java" | |||
unless="beanshell.present"/> | |||
<exclude name="${optional.type.package}/Script/*.java" | |||
unless="bsf.present"/> | |||
<exclude name="${optional.type.package}/Script/*.java" | |||
unless="rhino.present"/> | |||
<!-- fail if testcases can be loaded from the system classloader --> | |||
<exclude name="${ant.package}/AntClassLoaderDelegationTest.java" | |||
@@ -927,7 +927,132 @@ | |||
</tr> | |||
</table> | |||
<a name="scriptselector"></a> | |||
<h4>Script Selector</h4> | |||
<p> | |||
The <code><scriptselector></code> element enables you | |||
to write a complex selection algorithm in any | |||
<a href="http://jakarta.apache.org/bsf" target="_top">Apache BSF</a> | |||
supported language.</p> | |||
See the <a href="../OptionalTasks/script.html">Script</a> task for | |||
an explanation of scripts and dependencies. | |||
</p> | |||
<p> | |||
This selector was added in Apache Ant 1.7. | |||
</p> | |||
<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">language of the script.</td> | |||
<td valign="top" align="center">yes</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">src</td> | |||
<td valign="top">filename of the script</td> | |||
<td valign="top" align="center">no</td> | |||
</tr> | |||
</table> | |||
<p> | |||
If no <code>src</code> attribute is supplied, the script must be nested | |||
inside the selector declaration. | |||
</p> | |||
<p>The embedded script is invoked for every test, with | |||
the bean <code>self</code> | |||
is bound to the selector. It has an attribute <code>selected</code> | |||
must can be set using <code>setSelected(boolean)</code> to select that | |||
file. | |||
<p> | |||
The following beans are configured for every script, alongside | |||
the classic set of project, properties, and targets. | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
<td valign="top"><b>Bean</b></td> | |||
<td valign="top"><b>Description</b></td> | |||
<td valign="top"><b>Type</b></td> | |||
</tr> | |||
<tr> | |||
<td valign="top">self</td> | |||
<td valign="top">selector instance</td> | |||
<td valign="top">org.apache.tools.ant.types.optional</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">filename</td> | |||
<td valign="top">filename of the selection</td> | |||
<td valign="top" >String</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">file</td> | |||
<td valign="top">file of the selection</td> | |||
<td valign="top" >java.io.File</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">basedir</td> | |||
<td valign="top">Fileset base directory</td> | |||
<td valign="top" >java.io.File</td> | |||
</tr> | |||
</table> | |||
<p> | |||
The <code>self</code> bean maps to the selector, which has the following | |||
attributes. Only the <code>selected</code> flag is writeable, the rest | |||
are read only via their getter methods. | |||
<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>Type</b></td> | |||
</tr> | |||
<tr> | |||
<td valign="top">selected</td> | |||
<td valign="top">writeable flag to select this file</td> | |||
<td valign="top" align="center">boolean</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">filename</td> | |||
<td valign="top">filename of the selection</td> | |||
<td valign="top" >String</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">file</td> | |||
<td valign="top">file of the selection</td> | |||
<td valign="top" >java.io.File</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">basedir</td> | |||
<td valign="top">Fileset base directory</td> | |||
<td valign="top" >java.io.File</td> | |||
</tr> | |||
</table> | |||
<p> | |||
Example | |||
</p> | |||
<pre> | |||
<scriptselector language="javascript"> | |||
self.setSelected(true); | |||
</scriptselector> | |||
</pre> | |||
<p> | |||
Selects every file. | |||
</p> | |||
<pre> | |||
<scriptselector language="javascript"> | |||
self.setSelected((filename.length%2)==0); | |||
</scriptselector> | |||
</pre> | |||
Select files whose filename length is even. | |||
<a name="selectcontainers"></a> | |||
<h3>Selector Containers</h3> | |||
@@ -0,0 +1,123 @@ | |||
<project name="scriptselector" default="def" basedir="."> | |||
<property name="src.file" location="${ant.file}" /> | |||
<macrodef name="testselected"> | |||
<element name="selector" implicit="yes" optional="true"/> | |||
<attribute name="message"/> | |||
<sequential> | |||
<fail message="@{message} failed: file was not selected"> | |||
<condition> | |||
<not> | |||
<isfileselected file="{src.file}"> | |||
<selector/> | |||
</isfileselected> | |||
</not> | |||
</condition> | |||
</fail> | |||
</sequential> | |||
</macrodef> | |||
<macrodef name="testnoselected"> | |||
<element name="selector" implicit="yes" optional="true"/> | |||
<attribute name="message"/> | |||
<sequential> | |||
<fail message="@{message} failed: file was selected"> | |||
<condition> | |||
<isfileselected file="{src.file}"> | |||
<selector/> | |||
</isfileselected> | |||
</condition> | |||
</fail> | |||
</sequential> | |||
</macrodef> | |||
<!-- this is here to test the macro is well coded --> | |||
<target name="testNoSelector"> | |||
<testselected message="testNoSelector" > | |||
</testselected> | |||
</target> | |||
<target name="testNolanguage"> | |||
<testselected message="testNolanguage" > | |||
<selector> | |||
<scriptselector > | |||
self.setSelected(true); | |||
</scriptselector> | |||
</selector> | |||
</testselected> | |||
<scriptdef name="nolang"> | |||
</scriptdef> | |||
</target> | |||
<target name="testSelectionSetByDefault"> | |||
<testselected message="testSelectionSetByDefault" > | |||
<selector> | |||
<scriptselector language="javascript"> | |||
</scriptselector> | |||
</selector> | |||
</testselected> | |||
</target> | |||
<target name="testSelectionSetWorks"> | |||
<testselected message="testSelectionSetWorks" > | |||
<selector> | |||
<scriptselector language="javascript"> | |||
self.setSelected(false); | |||
self.setSelected(true); | |||
</scriptselector> | |||
</selector> | |||
</testselected> | |||
</target> | |||
<target name="testSelectionClearWorks"> | |||
<testnoselected message="testSelectionClearWorks"> | |||
<selector> | |||
<scriptselector language="javascript"> | |||
self.setSelected(false); | |||
</scriptselector> | |||
</selector> | |||
</testnoselected> | |||
</target> | |||
<target name="testFileAttribute"> | |||
<testselected message="testFileAttribute" > | |||
<selector> | |||
<scriptselector language="javascript"> | |||
self.setSelected(file.equals(self.getFile())); | |||
</scriptselector> | |||
</selector> | |||
</testselected> | |||
</target> | |||
<target name="testFilenameAttribute"> | |||
<testselected message="testFilenameAttribute" > | |||
<selector> | |||
<scriptselector language="javascript"> | |||
self.setSelected(filename.equals(self.getFilename())); | |||
</scriptselector> | |||
</selector> | |||
</testselected> | |||
</target> | |||
<target name="testBasedirAttribute"> | |||
<testselected message="testBasedirAttribute" > | |||
<selector> | |||
<scriptselector language="javascript"> | |||
self.setSelected(basedir.equals(self.getBasedir())); | |||
</scriptselector> | |||
</selector> | |||
</testselected> | |||
</target> | |||
<target name="notestFilenameLength"> | |||
<testselected message="notestFilenameLength" > | |||
<selector> | |||
<scriptselector language="javascript"> | |||
self.setSelected((filename.length%2)==0); | |||
</scriptselector> | |||
</selector> | |||
</testselected> | |||
</target> | |||
</project> |
@@ -49,13 +49,7 @@ public class Script extends Task { | |||
runner.addText(text); | |||
} | |||
runner.addBeans(getProject().getProperties()); | |||
runner.addBeans(getProject().getUserProperties()); | |||
runner.addBeans(getProject().getTargets()); | |||
runner.addBeans(getProject().getReferences()); | |||
runner.addBean("project", getProject()); | |||
runner.addBean("self", this); | |||
runner.bindToComponent(this); | |||
runner.executeScript("ANT"); | |||
} | |||
@@ -39,3 +39,4 @@ issigned=org.apache.tools.ant.taskdefs.condition.IsSigned | |||
isfileselected=org.apache.tools.ant.taskdefs.condition.IsFileSelected | |||
ispingable=org.apache.tools.ant.taskdefs.optional.condition.IsPingable | |||
mavenrepository=org.apache.tools.ant.taskdefs.repository.MavenRepository | |||
scriptselector=org.apache.tools.ant.types.optional.ScriptSelector |
@@ -1,5 +1,5 @@ | |||
/* | |||
* Copyright 2003-2004 The Apache Software Foundation | |||
* Copyright 2003-2005 The Apache Software Foundation | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
@@ -60,14 +60,7 @@ public class ScriptFilter extends TokenFilter.ChainableReaderFilter { | |||
return; | |||
} | |||
initialized = true; | |||
runner.addBeans(getProject().getProperties()); | |||
runner.addBeans(getProject().getUserProperties()); | |||
runner.addBeans(getProject().getTargets()); | |||
runner.addBeans(getProject().getReferences()); | |||
runner.addBean("project", getProject()); | |||
runner.addBean("self", this); | |||
runner.bindToComponent(this); | |||
} | |||
/** | |||
@@ -0,0 +1,161 @@ | |||
/* | |||
* Copyright 2005 The Apache Software Foundation | |||
* | |||
* Licensed 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. | |||
* | |||
*/ | |||
package org.apache.tools.ant.types.optional; | |||
import org.apache.tools.ant.types.selectors.BaseSelector; | |||
import org.apache.tools.ant.util.ScriptRunner; | |||
import org.apache.tools.ant.BuildException; | |||
import java.io.File; | |||
/** | |||
* Selector that lets you run a script with selection logic inline | |||
* @since Ant1.7 | |||
*/ | |||
public class ScriptSelector extends BaseSelector { | |||
/** | |||
* Has this object been initialized ? | |||
*/ | |||
private boolean initialized = false; | |||
/** | |||
* script runner | |||
*/ | |||
private ScriptRunner runner = new ScriptRunner(); | |||
/** | |||
* fields updated for every selection | |||
*/ | |||
private File basedir; | |||
private String filename; | |||
private File file; | |||
/** | |||
* selected flag | |||
*/ | |||
private boolean selected; | |||
/** | |||
* Defines the language (required). | |||
* | |||
* @param language the scripting language name for the script. | |||
*/ | |||
public void setLanguage(String language) { | |||
runner.setLanguage(language); | |||
} | |||
/** | |||
* Initialize on demand. | |||
* | |||
* @throws org.apache.tools.ant.BuildException | |||
* if someting goes wrong | |||
*/ | |||
private void init() throws BuildException { | |||
if (initialized) { | |||
return; | |||
} | |||
initialized = true; | |||
runner.bindToComponent(this); | |||
} | |||
/** | |||
* Load the script from an external file ; optional. | |||
* | |||
* @param file the file containing the script source. | |||
*/ | |||
public void setSrc(File file) { | |||
runner.setSrc(file); | |||
} | |||
/** | |||
* The script text. | |||
* | |||
* @param text a component of the script text to be added. | |||
*/ | |||
public void addText(String text) { | |||
runner.addText(text); | |||
} | |||
/** | |||
* Method that each selector will implement to create their selection | |||
* behaviour. If there is a problem with the setup of a selector, it can | |||
* throw a BuildException to indicate the problem. | |||
* | |||
* @param basedir A java.io.File object for the base directory | |||
* @param filename The name of the file to check | |||
* @param file A File object for this filename | |||
* | |||
* @return whether the file should be selected or not | |||
*/ | |||
public boolean isSelected(File basedir, String filename, File file) { | |||
init(); | |||
setSelected(true); | |||
this.file=file; | |||
this.basedir=basedir; | |||
this.filename=filename; | |||
runner.addBean("basedir", basedir); | |||
runner.addBean("filename", filename); | |||
runner.addBean("file", file); | |||
runner.executeScript("<ANT-Selector>"); | |||
return isSelected(); | |||
} | |||
/** | |||
* get the base directory | |||
* @return | |||
*/ | |||
public File getBasedir() { | |||
return basedir; | |||
} | |||
/** | |||
* get the filename of the file | |||
* @return | |||
*/ | |||
public String getFilename() { | |||
return filename; | |||
} | |||
/** | |||
* get the file that is currently to be tested | |||
* @return | |||
*/ | |||
public File getFile() { | |||
return file; | |||
} | |||
/** | |||
* get state of selected flag | |||
* @return | |||
*/ | |||
public boolean isSelected() { | |||
return selected; | |||
} | |||
/** | |||
* set the selected state | |||
* Intended for script use, not as an Ant attribute | |||
* @param selected | |||
*/ | |||
public void setSelected(boolean selected) { | |||
this.selected = selected; | |||
} | |||
} |
@@ -1,5 +1,5 @@ | |||
/* | |||
* Copyright 2003-2004 The Apache Software Foundation | |||
* Copyright 2003-2005 The Apache Software Foundation | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
@@ -22,6 +22,9 @@ import java.io.IOException; | |||
import org.apache.bsf.BSFException; | |||
import org.apache.bsf.BSFManager; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.ProjectComponent; | |||
import org.apache.tools.ant.Project; | |||
import java.util.Map; | |||
import java.util.HashMap; | |||
import java.util.Iterator; | |||
@@ -190,4 +193,20 @@ public class ScriptRunner { | |||
public void addText(String text) { | |||
this.script += text; | |||
} | |||
/** | |||
* Bind the runner to a project component. | |||
* Properties, targets and references are all added as beans; | |||
* project is bound to project, and self to the component. | |||
* @param component to become <code>self</code> | |||
*/ | |||
public void bindToComponent(ProjectComponent component) { | |||
Project project=component.getProject(); | |||
addBeans(project.getProperties()); | |||
addBeans(project.getUserProperties()); | |||
addBeans(project.getTargets()); | |||
addBeans(project.getReferences()); | |||
addBean("project", project); | |||
addBean("self", component); | |||
} | |||
} |
@@ -0,0 +1,60 @@ | |||
/* | |||
* Copyright 2005 The Apache Software Foundation | |||
* | |||
* Licensed 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. | |||
* | |||
*/ | |||
package org.apache.tools.ant.types.optional; | |||
import org.apache.tools.ant.BuildFileTest; | |||
/** | |||
* Test that scripting selection works. Needs scripting support to work | |||
*/ | |||
public class ScriptSelectorTest extends BuildFileTest { | |||
public ScriptSelectorTest(String name) { | |||
super(name); | |||
} | |||
public void setUp() { | |||
configureProject("src/etc/testcases/types/selectors/scriptselector.xml"); | |||
} | |||
public void testNolanguage() { | |||
expectBuildExceptionContaining("testNolanguage", | |||
"Absence of language attribute not detected", | |||
"script language must be specified"); | |||
} | |||
public void testSelectionSetByDefault() { | |||
executeTarget("testSelectionSetByDefault"); | |||
} | |||
public void testSelectionSetWorks() { | |||
executeTarget("testSelectionSetWorks"); | |||
} | |||
public void testSelectionClearWorks() { | |||
executeTarget("testSelectionClearWorks"); | |||
} | |||
public void testFilenameAttribute() { | |||
executeTarget("testFilenameAttribute"); | |||
} | |||
public void testFileAttribute() { | |||
executeTarget("testFileAttribute"); | |||
} | |||
public void testBasedirAttribute() { | |||
executeTarget("testBasedirAttribute"); | |||
} | |||
} |