Monday, April 25, 2011

Writing an Ant Task

Many are having a need to write their own ant task, just like I had. I wanted to search some strings in a set of files and write the result into some destination files. Just listing the steps to achieve the same.

1. I work with Eclipse. Created a Java project and created the below build.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Search" basedir="." default="jar">

    <target name="clean" description="Delete all generated files">
        <delete dir="classes"/>
        <delete file="search.jar"/>
    </target>

    <target name="compile" description="Compiles the Task">
        <javac srcdir="src" destdir="classes"/>
    </target>

    <target name="jar" description="JARs the Task" depends="compile" >
        <jar destfile="search.jar" basedir="classes"/>
    </target>
  
</project>

2. Wrote a Java code which extends Task class. I wanted to have sourceFile, destFile and searchString as parameters and hence having three  instance variables as sourceFileString, destFileString and searchString.  On execute() method functionality has been implemented.

import org.apache.tools.ant.Task;
import java.io.*;

public class SearchTask extends Task {
   
    private String sourceFileString = null;
    private String destFileString = null;
    private String searchString = null;
   
    public void setSourceFile(String sourceFile)
    {   
        this.sourceFileString = sourceFile;
        System.out.println(" Source file set to "+sourceFile);
    }
   
    public void setDestFile(String destFile)
    {
        this.destFileString = destFile;
        System.out.println(" dest file set to "+destFile);
    }
   
    public void setSearchString(String searchString)
    {
        this.searchString = searchString;
        System.out.println(" search string set to "+searchString);
    }
   
    public void execute()
    {
        System.out.println(" Execute called ");
        File sourceFile = new File(sourceFileString);
        if(sourceFile.isDirectory())
        {
            File[] array = sourceFile.listFiles();
            for(int i=0;i<array.length;i++)
            {
                File file = array[i];
                search(file);
            }
        }
        else
        {
            search(sourceFile);
        }
    }
   
    private void search(File sourceFile)
    {
        System.out.println(" searching starts ");
       
        BufferedReader reader = null;
        BufferedWriter writer = null;
       
        try
        {
            reader = new BufferedReader(new FileReader(sourceFile));
            writer = new BufferedWriter(new FileWriter(destFileString));
            String line  = null;
           
            while( (line = reader.readLine()) != null)
            {
                System.out.println(" line =="+line+" searchString "+searchString);
                if(line.indexOf(searchString) > -1)
                {
                    writer.write(line);
                    writer.newLine();
                }
            }
        }
        catch(Exception ee)
        {
            ee.printStackTrace();
        }
        finally
        {
            try
            {
                writer.close();
                reader.close();
            }
            catch(Exception ee)
            {
                ee.printStackTrace();
            }
        }
    }
}


3. Executed jar task and created search.jar. Then added the below task.

<target name="search" depends="jar" description="searching the file">
        <taskdef name="search" classname="SearchTask" classpath="search.jar"/>
        <search sourceFile="e:\\searchFile.txt" destFile="e:\\searchresult.txt" searchString="cool" >
        </search>

</target>

No comments:

Post a Comment