You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by br...@apache.org on 2002/08/08 07:47:27 UTC
cvs commit: jakarta-ant/src/main/org/apache/tools/ant/types/selectors SelectSelector.java
bruce 2002/08/07 22:47:27
Modified: docs/manual/CoreTypes selectors-program.html selectors.html
src/main/org/apache/tools/ant/types/selectors
SelectSelector.java
Log:
Added a check on Property names using the "if" and "unless" attributes
for the selector tag, so that selectors that it contains are made
conditional.
Revision Changes Path
1.3 +1 -1 jakarta-ant/docs/manual/CoreTypes/selectors-program.html
Index: selectors-program.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/CoreTypes/selectors-program.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- selectors-program.html 1 Jun 2002 12:26:35 -0000 1.2
+++ selectors-program.html 8 Aug 2002 05:47:27 -0000 1.3
@@ -75,7 +75,7 @@
<code>isSelected()</code> method call <code>validate()</code> and
a BuildException will be thrown with the contents of your error
message. The <code>validate()</code> method also gives you a
- last change to check your settings for consistency because it
+ last chance to check your settings for consistency because it
calls <code>verifySettings()</code>. Override this method and
call <code>setError()</code> within it if you detect any
problems in how your selector is set up.</p>
1.4 +70 -11 jakarta-ant/docs/manual/CoreTypes/selectors.html
Index: selectors.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/CoreTypes/selectors.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- selectors.html 15 Jul 2002 11:29:31 -0000 1.3
+++ selectors.html 8 Aug 2002 05:47:27 -0000 1.4
@@ -23,21 +23,21 @@
contain other selectors, and these are called
<a href="#selectcontainers"><code>Selector Containers</code></a>.
There is also a category of selectors that allow
- user-defined extensions, called
+ user-defined extensions, called
<a href="#customselect"><code>Custom Selectors</code></a>.
The ones built in to Ant are called
<a href="#coreselect"><code>Core Selectors</code></a>.
</p>
-
+
<a name="coreselect"></a>
<h3>Core Selectors</h3>
<p>Core selectors are the ones that come standard
with Ant. They can be used within a fileset and can be contained
within Selector Containers.</p>
-
+
<p>The core selectors are:</p>
-
+
<ul>
<li><a href="#containsselect"><contains></a> - Select
files that contain a particular text string
@@ -161,7 +161,7 @@
<h4>Depend Selector</h4>
<p>The <code><depend></code> tag selects files
- whose last modified date is later than another, equivalent file in
+ whose last modified date is later than another, equivalent file in
another location.</p>
<p>The <code><depend></code> tag supports the use of a
@@ -443,9 +443,13 @@
<li><a href="#orselect"><or></a> - selects a file if any one
of the contained selectors selects it.
<li><a href="#selectorselect"><selector></a> - contains only one
- selector and forwards all requests to it without alteration. This
+ selector and forwards all requests to it without alteration, provided
+ that any <code>"if"</code> or
+ <code>"unless"</code> conditions are met. This
is the selector to use if you want to define a reference. It is
- usable as an element of <code><project></code>.
+ usable as an element of <code><project></code>. It is also
+ the one to use if you want selection of files to be dependent on
+ Ant property settings.
</ul>
<p>All selector containers can contain any other selector, including
@@ -618,12 +622,43 @@
<h4>Selector Reference</h4>
<p>The <code><selector></code> tag is used to create selectors
- that can be reused through references. It should be used outside of
+ that can be reused through references. It is the only selector which can
+ be used outside of
any target, as an element of the <code><project></code> tag. It
can contain only one other selector, but of course that selector can
be a container.
</p>
+ <p>The <code><selector></code> tag can also be used to select
+ files conditionally based on whether an Ant property exists or not.
+ This functionality is realized using the <code>"if"</code> and
+ <code>"unless"</code> attributes in exactly the same way they
+ are used on targets or on the <code><include></code> and
+ <code><exclude></code> tags within a
+ <code><patternset></code>.</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">if</td>
+ <td valign="top">Allow files to be selected only if the named
+ property is set.
+ </td>
+ <td valign="top" align="center">No</td>
+ </tr>
+ <tr>
+ <td valign="top">unless</td>
+ <td valign="top">Allow files to be selected only if the named
+ property is <b>not</b> set.
+ </td>
+ <td valign="top" align="center">No</td>
+ </tr>
+ </table>
+
<p>Here is an example of how to use the Selector Reference:</p>
<blockquote><pre>
@@ -647,7 +682,7 @@
</fileset>
</zip>
</target>
-
+
</project>
</pre></blockquote>
@@ -655,18 +690,42 @@
class file and javadoc file associated with them.
</p>
+ <p>And an example of selecting files conditionally, based on whether
+ properties are set:</p>
+
+ <blockquote><pre>
+<fileset dir="${working.copy}">
+ <or>
+ <selector if="include.tests">
+ <filename name="**/*Test.class">
+ </selector>
+ <selector if="include.source">
+ <and>
+ <filename name="**/*.java">
+ <not>
+ <selector unless="include.tests">
+ <filename name="**/*Test.java">
+ </selector>
+ </not>
+ </and>
+ </selector>
+ </or>
+</fileset>
+</pre></blockquote>
+ <p>A fileset that conditionally contains Java source files and Test
+ source and class files.</p>
<a name="customselect"></a>
<h3>Custom Selectors</h3>
- <p>You can write your own selectors and use them within the selector
+ <p>You can write your own selectors and use them within the selector
containers by specifying them within the <custom> tag.</p>
<p>First, you have to write your selector class in Java. The only
requirement it must meet in order to be a selector is that it implements
the <code>org.apache.tools.ant.types.selectors.FileSelector</code>
- interface, which contains a single method. See
+ interface, which contains a single method. See
<a href="selectors-program.html">Programming Selectors in Ant</a> for
more information.</p>
1.4 +78 -4 jakarta-ant/src/main/org/apache/tools/ant/types/selectors/SelectSelector.java
Index: SelectSelector.java
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/types/selectors/SelectSelector.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SelectSelector.java 25 Jul 2002 15:21:23 -0000 1.3
+++ SelectSelector.java 8 Aug 2002 05:47:27 -0000 1.4
@@ -55,6 +55,8 @@
package org.apache.tools.ant.types.selectors;
import java.util.Enumeration;
+import java.io.File;
+
import org.apache.tools.ant.Project;
/**
@@ -68,7 +70,10 @@
* @author <a href="mailto:bruce@callenish.com">Bruce Atherton</a>
* @since 1.5
*/
-public class SelectSelector extends AndSelector {
+public class SelectSelector extends BaseSelectorContainer {
+
+ private String ifProperty;
+ private String unlessProperty;
/**
* Default constructor.
@@ -79,7 +84,16 @@
public String toString() {
StringBuffer buf = new StringBuffer();
if (hasSelectors()) {
- buf.append("{select: ");
+ buf.append("{select");
+ if (ifProperty != null) {
+ buf.append(" if: ");
+ buf.append(ifProperty);
+ }
+ if (unlessProperty != null) {
+ buf.append(" unless: ");
+ buf.append(unlessProperty);
+ }
+ buf.append(" ");
buf.append(super.toString());
buf.append("}");
}
@@ -155,11 +169,71 @@
* not.
*/
public void verifySettings() {
- if (selectorCount() != 1) {
- setError("One and only one selector is allowed within the " +
+ int cnt = selectorCount();
+ if (cnt < 0 || cnt > 1) {
+ setError("Only one selector is allowed within the " +
"<select> tag");
}
}
+ /**
+ * Ensures that the selector passes the conditions placed
+ * on it with <code>if</code> and <code>unless</code>.
+ */
+ public boolean passesConditions() {
+ if (ifProperty != null &&
+ getProject().getProperty(ifProperty) == null) {
+ return false;
+ } else if (unlessProperty != null &&
+ getProject().getProperty(unlessProperty) != null) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Sets the if attribute to a property which must exist for the
+ * selector to select any files.
+ */
+ public void setIf(String ifProperty) {
+ this.ifProperty = ifProperty;
+ }
+
+ /**
+ * Sets the unless attribute to a property which cannot exist for the
+ * selector to select any files.
+ */
+ public void setUnless(String unlessProperty) {
+ this.unlessProperty = unlessProperty;
+ }
+
+ /**
+ * Returns true (the file is selected) only if the if property (if any)
+ * exists, the unless property (if any) doesn't exist, and the
+ * contained selector (if any) selects the file. If there is no contained
+ * selector, return true (because we assume that the point was to test
+ * the if and unless conditions).
+ *
+ * @param basedir the base directory the scan is being done from
+ * @param filename the name of the file to check
+ * @param file a java.io.File object for the filename that the selector
+ * can use
+ * @return whether the file should be selected or not
+ */
+ public boolean isSelected(File basedir, String filename, File file) {
+ validate();
+
+ // Deal with if and unless properties first
+ if (!(passesConditions())) {
+ return false;
+ }
+
+ Enumeration e = selectorElements();
+ if (!(e.hasMoreElements())) {
+ return true;
+ }
+ FileSelector f = (FileSelector)e.nextElement();
+ return f.isSelected(basedir,filename,file);
+ }
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>