|
12.5. Creating Custom FiltersYou can implement custom Ant filters. To do that, you can extend Ant classes like org.apache.tools.ant.filters.BaseParamFilterReader. If you want your filter to be chainable, implement the org.apache.tools.ant.filters.ChainableReader interface. Example 12-18 shows how to write a filter. In this example, the code reads each line of a Java file using the read( ) method and adds a Java single-line comment, //, at the beginning of each line. When the code reaches the end of the file, it returns a value of -1 to quit. Example 12-18. A new filter (ch12/filter/src/ProjectFilter.java)import java.io.Reader; import java.io.IOException; import org.apache.tools.ant.filters.ChainableReader; import org.apache.tools.ant.filters.BaseParamFilterReader; public final class ProjectFilter extends BaseParamFilterReader implements ChainableReader { String data = null; public ProjectFilter( ) { super( ); } public ProjectFilter(final Reader reader) { super(reader); } public final Reader chain(final Reader reader) { ProjectFilter filter = new ProjectFilter(reader); filter.setInitialized(true); return filter; } public final int read( ) throws IOException { int leadChar = -1; if(data != null) { leadChar = data.charAt(0); data = data.substring(1); if(data.length( ) == 0) { data = null; } } else { data = readLine( ); if(data == null) { leadChar = -1; } else { data = "// " + data; return read( ); } } return leadChar; } } You can see how to use this new filter in the build file in Example 12-19. This build file copies all .java files in the project, comments out each line, and stores the result in a directory named commented. Example 12-19. Build file for the new filter (ch12/filter/build.xml)<?xml version="1.0"?> <project basedir="." default="main"> <property name="src" value="src"/> <property name="output" value="output"/> <property name="commented" value="commented"/> <target name="main" depends="jar"> <copy todir="${commented}"> <fileset dir="${src}" includes="**/*.java"/> <filterchain> <filterreader classname="ProjectFilter" classpath="Project.jar"/> </filterchain> </copy> </target> <target name="compile"> <mkdir dir="${output}"/> <mkdir dir="${commented}"/> <javac srcdir="${src}" destdir="${output}"/> </target> <target name="jar" depends="compile"> <jar destfile="Project.jar" basedir="${output}"/> </target> </project> When you run this build file, every line in the copied Project.java file is commented out when filtered and copied: // import java.io.Reader; // import java.io.IOException; // import org.apache.tools.ant.filters.ChainableReader; // import org.apache.tools.ant.filters.BaseParamFilterReader; // // public final class ProjectFilter extends BaseParamFilterReader implements ChainableReader // { // String data = null; . . . |
|