I'm sure there are lots of current solutions.  I'm simply suggesting
that there is value in being able to do this easily in the build file.
David Dabbs wrote:
> 
> David,
> 
> Here's one possibility. I've successfuly employed this for 'aggregating'
> together several tasks I wanted to 'drive' with a fixed list of files loaded
> from a Manifest file.
> 
> Create a new, custom task called <TGZ>. It should extend MatchingTask and
> accept whatever common attributes you're interested in passing, e.g.
> filename.
> 
> Define the following methods:
>     createGunzip()
>     getGunzip()   // may not be necessary
>     createUntar()
>     getUntar()   // may not be necessary
>     execute();
> 
> The createXXX() methods will create and return an instance of the requested
> task.
> They should also use the requested task object's setXX() method(s) to set
> common parameters such as filename, destination, etc.
> 
> Execute will call, in sequence, unzip.execute() and untar.execute();
> 
> To use the aggregate task without having to retype the tags verytime you
> with to use it, simply create a dummy target and id the <TGZ> tag with a
> reference id. Any target wishing to <tgz> will simply use
> 
>     <tgz refid="foo" option="bar" option="baz" />
> 
> Here's a sample. Note I just banged this out and did not try to compile it.
> 
> /***************************************************************/
> package org.apache.tools.ant.taskdefs.optional;
> 
> import org.apache.tools.ant.*;
> import org.apache.tools.ant.taskdefs.GUnzip;
> import org.apache.tools.ant.taskdefs.Untar;
> import org.apache.tools.ant.taskdefs.MatchingTask;
> 
> public class TGZ extends MatchingTask {
> 
>     private GUnzip gunzip;
>     private Untar untar;
> 
>     public GUnzip createGunzip() {
>         if (gunzip == null) {
>             gunzip = (GUnzip) project.createTask("gunzip");  //XX
>         } else {
>             //XX error if more than one gunzip encountered
>         }
>         return gunzip;
>     }
> 
>     public Untar createUntar() {
>         if (untar == null) {
>             untar = (untar) project.createTask("untar");  //XX
>         } else {
>             //XX error if more than one untar encountered
>         }
>         return untar;
>     }
> 
>     /*
>     setXXX methods for attributes this task (TGZ) defines. setFile( File
> file), for example
>     */
> 
>     public void execute() throws BuildException
>     {
>         checkParameters();
>         /*
>         set appropriate options on gunzip and untar task objects
>         for each file specified ("fileset" instance variable)...
>             gunzip.execute();
>             untar.execute();
> 
>         See MatchingTask-derived clases such as Javac.java or others for
>         examples of how to scan filesets for pattern matched files.
>         */
>     }
> 
>     private void checkParameters() throws BuildException
>     {
>         /*
> 
>         YOUR ATTRIBUTE VALIDATION HERE....
> 
>         if ( javac==null) {
>             throw new BuildException("javac element is required.",
> location);
>         }
>         if ( jspc != null ) {
>             //log("JSP precompilation enabled.", Project.MSG_INFO);
>         }
>         */
>     }
> 
>     /*
>     * Returns whether the given String parameter has been defined.
>     */
>     private boolean checkParam(String param)
>     {
>         return !((param == null) || (param.length()==0) ||
> (param.equals("null")) ) ;
>     }
> }
> 
> This is a lot of hassle to simply avoid copying two task definitions, but
> with more complex "functions" it might be worth it I suppose.
> 
> Hope this helps,
> 
> David
> 
> ----- Original Message -----
> From: "David Corbin" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Wednesday, January 10, 2001 6:47 AM
> Subject: Re: Parameterized "task-function"
> 
> > > David Dabbs wrote:
> > >
> > > > Has any thought been given to being able to construct a task from
> > > > several tasks, and have it parameterized?  I realize this can be
> > > cobbled
> > > > together with targets and properties, but we all know that's a lousy
> > >
> > > > solution, don't we?
> > >
> > > Do you have a use case? I'm not sure what you're looking for. I could
> > > see a generic task that, given a list of refIds, could execute() them
> > > in series assuming they've already been defined. Not sure if that
> > > would buy you much ovcer the ugly way.
> > >
> > > David Dabbs
> >
> > A) I have dozens of .tgz files I want to extract.  To do this, I have to
> > specify two tasks <gunzip> and <untar>.  I'd like to make one task that
> > incorporates both.
> >
> > B) eventually, I hope ANT will support an include.  When it does, I'll
> > want to be able to "pass arguments" for standard actions.
> >
> > (That's just starters).  As was pointed out to me, ANT is a scripting
> > language.  I want function/procedures.   Is that so odd?
> >
> > --
> > David Corbin
> > Mach Turtle Technologies, Inc.
> > http://www.machturtle.com
> > [EMAIL PROTECTED]
> >

-- 
David Corbin            
Mach Turtle Technologies, Inc.
http://www.machturtle.com
[EMAIL PROTECTED]

Reply via email to