ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dominique Devienne <DDevie...@lgc.com>
Subject RE: Which task
Date Thu, 23 Jan 2003 17:43:45 GMT
<available> tells you if it's found in the searchpath, but won't tell you
the actual full pathname. This little task will. --DD

package com.lgc.buildmagic;

import java.io.File;
import java.io.IOException;

import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;

import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.DirSet;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.FileList;
import org.apache.tools.ant.types.Reference;

/**
 * Attempt to locate a file within a given search path.
 * <p>
 * Unlike &lt;available&gt;, this task returns the full path name to the
 * search file in the specified property, but only if found.
 * <pre>
 *   &lt;path id="path" path="${env.PATH}" /&gt;
 *   &lt;which property="cvs.exe" basename="cvs.exe" searchpathref="path"
/&gt;
 *   &lt;fail message="cvs.exe not in PATH!" unless="cvs.exe" /&gt;
 *   &lt;exec executable="${cvs.exe}" /&gt;
 * </pre>
 *
 * @author <a href="mailto:ddevienne@lgc.com">Dominique Devienne</a>
 * @version Sep 2002 - Copyright (c) 2002, Landmark Graphics Corp.
 */
public class Which
             extends Task {

    /** The search path used to find a file. */
    private Path searchpath;

    /** The simple name of the file to search. */
    private String basename;

    /**
     * The property name to contain the full
     * pathname of the file searched for.
     */
    private String property;

    /**
     * Runs the various sub-builds.
     */
    public void execute()
                throws BuildException {
        if (property == null) {
            throw new BuildException("property attribute is required", 
                                     getLocation());
        }

        if (searchpath == null) {
            throw new BuildException("No searchpath specified",
                                     getLocation());
        }

        final String[] filenames = searchpath.list();
        final int count = filenames.length;
        if (count < 1) {
            throw new BuildException("Empty searchpath specified",
                                     getLocation());
        }

        for (int i=0; i<count; ++i) {
            File parent = new File(filenames[i]);
            if (!parent.isDirectory()) {
                // Skip non-directories in the search path
                continue;
            }

            log("Searching " + parent, Project.MSG_DEBUG);
            File file = new File(parent, basename);
            if (file.exists() && file.isFile()) {
                String fullpath = null;
                try {
                    fullpath = file.getCanonicalPath();
                } catch (IOException e) {
                    throw new BuildException(e, getLocation());
                }
                getProject().setNewProperty(property, fullpath);
                return;
            }
        }
    }

    /**
     * The short name of the file search in the search path.
     *
     * @param  basename the short file name
     */
    public void setBasename(String basename) {
        this.basename = basename;
    }

    /**
     * Sets the name of the property to contain the full pathname of the 
     * file searched for, if found.
     *
     * @param property the name of the property to set.
     */
    public void setProperty(String property) {
        this.property = property;
    }

    /**
     * Adds a directory set to the implicit build path.
     * <p>
     * <em>Note that the directories will be added to the build path
     * in no particular order, so if order is significant, one should
     * use a file list instead!</em>
     *
     * @param  set the directory set to add.
     */
    public void addDirset(DirSet set) {
        getSearchpath().addDirset(set);
    }

    /**
     * Adds a file set to the implicit build path.
     * <p>
     * <em>Note that the directories will be added to the build path
     * in no particular order, so if order is significant, one should
     * use a file list instead!</em>
     *
     * @param  set the file set to add.
     */
    public void addFileset(FileSet set) {
        getSearchpath().addFileset(set);
    }

    /**
     * Adds an ordered file list to the implicit build path.
     * <p>
     * <em>Note that contrary to file and directory sets, file lists
     * can reference non-existent files or directories!</em>
     *
     * @param  list the file list to add.
     */
    public void addFilelist(FileList list) {
        getSearchpath().addFilelist(list);
    }

    /**
     * Set the searchpath to be used to find sub-projects.
     * 
     * @param  s an Ant Path object containing the searchpath.
     */
    public void setSearchpath(Path s) {
        getSearchpath().append(s);
    }
    
    /**
     * Creates a nested build path, and add it to the implicit build path.
     *
     * @return the newly created nested build path.
     */
    public Path createSearchpath() {
        return getSearchpath().createPath();
    }

    /**
     * Creates a nested <code>&lt;searchpathelement&gt;</code>,
     * and add it to the implicit build path.
     *
     * @return the newly created nested build path element.
     */
    public Path.PathElement createSearchpathElement()
                            throws BuildException {
        return getSearchpath().createPathElement();
    }

    /**
     * Gets the implicit build path, creating it if <code>null</code>.
     *
     * @return the implicit build path.
     */
    private Path getSearchpath() {
        if (searchpath == null) {
            searchpath = new Path(getProject());
        }
        return searchpath;
    }

    /**
     * Searchpath to use, by reference.
     *
     * @param  r a reference to an Ant Path object containing the
searchpath.
     */
    public void setSearchpathRef(Reference r) {
        createSearchpath().setRefid(r);
    }

} // END class Which


-----Original Message-----
From: Bill Winspur [mailto:bwinspur@wynnon.com] 
Sent: Thursday, January 23, 2003 11:04 AM
To: Ant Users List
Subject: Re: Which task

I just joined this thread, and missed earlier messages, but... I've been
looking for a more primitive 'which' functionality on ant, more like the
unix 'which <file>' command. I'd like to search the host command path,
available in system property 'java.library.path', asking the question:
"which directory from classpath x contains file y?". An ideal task would be
something like:

<which classpath=${java.library.path} fileSought="myFileName"
propertySet="hostDir"/>

or

<which fileSought="myFileName" propertySet="hostDir">
    <path ....>
        <pathelement .../>
        ...
    </path>
</which>

I've checked the faq and browsed the 1.5.1 manual for 1.83 hours, but have
not found a way to determine a specified file's location on a path. Is there
a way to do this in ant ?

Bill Winspur.

--
To unsubscribe, e-mail:   <mailto:ant-user-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:ant-user-help@jakarta.apache.org>


Mime
View raw message