ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jacob Kjome <h...@visi.com>
Subject RE: Which task
Date Thu, 23 Jan 2003 18:35:58 GMT

Hi Dominique.  Man, you are prolific.  Do you have Ant commit rights 
yet?  You should.

Anyway, one annoying thing about the <Available> task is that it will only 
report that class is available if it, and all its dependencies, can be 
loaded.  It took me a while of pulling my hair out trying to figure out why 
it wasn't working as I expected it to to figure this out, but I did 
eventually after I tried using the <available> task to check on a class 
that didn't have any dependencies other than stanard java classes.  I was 
trying to look for a class in the Coyote .jar file in Tomcat to see what 
version of Tomcat I was dealing with (4.0.x, 4.1.x, 5.0).

Does your task avoid this glitch?  If it does, can we get your work-around 
moved to the standard <available> task?

Jake


At 11:43 AM 1/23/2003 -0600, you wrote:
><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
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message