Ant: The Definitive Guide, 2nd Edition
|
12.6. Creating Custom Selectors
Writing custom Ant selectors is possible if you extend a class like org.apache.tools.ant.types.selectors.BaseExtendSelector. In code, selectors are passed File objects and return true or false depending on whether or not a file is acceptable. Say, for example, that you want to copy files less than a megabyte in length. Example 12-20 shows a selector that tests file length and returns true if the file is OK, false otherwise. Example 12-20. A new selector (ch12/selector/src/ProjectSelector.java)
import java.io.File; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.types.selectors.BaseExtendSelector; public class ProjectSelector extends BaseExtendSelector { public boolean isSelected(File basedir, String filename, File file) throws BuildException { if(file.length( ) < 1024 * 1024){ return true; } else { return false; } } }
Example 12-21 is a build file that uses this new selector when copying files; in particular, it copies over its own source code to a directory named sizeOK. Example 12-21. Build file for the new selector (ch12/selector/build.xml)
<?xml version="1.0" ?> <project basedir="." default="main"> <property name="src" value="src"/> <property name="output" value="output"/> <property name="sizeOK" value="sizeOK"/> <target name="main" depends="jar"> <copy todir="${sizeOK}"> <fileset dir="${src}"> <selector> <custom classname="ProjectSelector" classpath="Project.jar"/> </selector> </fileset> </copy> </target> <target name="compile"> <mkdir dir="${output}"/> <mkdir dir="${sizeOK}"/> <javac srcdir="${src}" destdir="${output}"/> </target> <target name="jar" depends="compile"> <jar destfile="Project.jar" basedir="${output}"/> </target> </project>
Here's what you see when you run this build file: %ant Buildfile: build.xml compile: [mkdir] Created dir: /home/steven/ant/ch12/selector/output [mkdir] Created dir: /home/steven/ant/ch12/selector/writeable [javac] Compiling 1 source file to /home/steven/ant/ch12/selector/output jar: [jar] Building jar: /home/steven/ant/ch12/selector/Project.jar main: [copy] Copying 1 file to /home/steven/ant/ch12/selector/sizeOK BUILD SUCCESSFUL Total time: 3 seconds
In this case, the code only copies files less than a megabyte in length, but custom seletors like this can select on anything, e.g., file creation date, read/write status, filename, and so on. |
|