En egen Ant-task

Så här kan en väldigt enkel Ant-task se ut. Denna task räknar rader i alla filer som anges med ett nästlat fileset. (Stöd för nästlade filesets får jag genom att ärva från MatchingTask.)

Nästan det enda Ant-specifika är hur jag får tag på listan med filer, och att jag använder ”log()” för att skriva ut resultatet. Svårare än så behöver det inte vara.

package se.bluefish.ant;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.MatchingTask;
import org.apache.tools.ant.types.FileSet;

public class MetricsTask extends MatchingTask {
    private String srcdir="src";

    public void execute() throws BuildException {
        String[] files = getDirectoryScanner(new File(srcdir)).getIncludedFiles();
        int lines=0;
        try {
            for( int i=0; i<files.length; ++i ) {
                lines += countLines(srcdir+File.separator+files[i]);
            }
        } catch (IOException e) {
            throw new BuildException(e);
        }
        log("Lines: "+lines);
    }

    private int countLines(String filename) throws IOException {
        BufferedReader in=null;
        int lines = 0;
        try {
            in = new BufferedReader(new FileReader(filename));
            while( in.readLine() != null ) {
                ++lines;
            }
        } finally {
            if( in != null ) {
                in.close();
            }
        }
        return lines;
    }

    public void addConfiguredFileset(FileSet fs) {
        fileset = fs; // fileset is a protected member of parent class
    }

    public void setSrcdir(String srcdir) {
        this.srcdir = srcdir;
    }
}

En enkel användning i en build.xml-fil kan se ut så här:

<project basedir=”.” default=”use” name=”ant-task-metrics”>
    <target name=”build”>
        <mkdir dir=”bin”></mkdir>
        <javac destdir=”bin” srcdir=”src”></javac>
    </target>
 
    <target depends=”build” name=”createjar”>
        <jar basedir=”bin” destfile=”ant-wc.jar”></jar>
    </target>
 
    <target depends=”createjar” name=”declare”>
        <taskdef classname=”se.bluefish.ant.MetricsTask” classpath=”ant-wc.jar” name=”metrics”></taskdef>
    </target>
 
    <target depends=”declare” name=”use”>
        <metrics srcdir=”src”>
            <fileset>
                <include name=”**/*.java”></include>
            </fileset>
        </metrics>
    </target>
</project>