You could do the following, which will require no changes to code:

1) Define 2 tasks EmbeddedTaskdef simillar to the one already described
and EmbeddedTaskRunner described bellow.

2) EmbeddedTaskdef will load the definition into some symbol-table which it 
shares with EmbeddedTaskRunner.

3) EmbeddedTaskdef will add the new task name (e.g., counterTask) as defined by 
EmbeddedTaskRunner class.
   Project.addTaskDefinition("counterTask", EmbeddedTaskRunner.class)

4) EmbeddedTaskRunner implements the DymanicAPI, it finds the definition on the 
symbol-table
using the task-type set for the task (i.e. Task.getTaskType()). It will use that
to find the associated script and then resolve attributes and nested elements 
from there.

The only problem with this solution is that the implementation needs to provide 
its own
symbol-table which may be problematic when using <import/> and <ant/>. It would 
be nicer
if ANT were willing to manage this kind of use symbol-table as some sort of 
generic service.

That would make maintaining code like this much more straigh forward.

Jose Alberto

> -----Original Message-----
> From: Alexey Solofnenko [mailto:[EMAIL PROTECTED]
> Sent: 06 June 2003 16:34
> To: 'Ant Users List'
> Cc: '[EMAIL PROTECTED]'
> Subject: RE: Embedded dynamic ANT tasks.
> 
> 
> Hello Dawid,
> 
>   I was thinking about something like that. There is 
> DynamicConfigurator to
> support dynamic properties, but there is no way to create 
> dynamic tasks.
> Maybe we should ask ANT developers to support task factories 
> in addition to
> class names. It would be a simple patch. For example in
> ComponentHelper.createNewTask() we can add something like:
> 
> if (o instanceof TaskFactory) {
>   o=((TaskFactory)o).createNewTask(taskType);
> }
> 
> // continue
> if (o instanceof Task) {
> ....
> 
> 
> - Alexey.
> 
> --
> { http://trelony.cjb.net/ } Alexey N. Solofnenko
> Pleasant Hill, CA (GMT-8 usually)
> 
> 
> -----Original Message-----
> From: Dawid Weiss [mailto:[EMAIL PROTECTED] 
> Sent: Friday, June 06, 2003 7:53 AM
> To: user@ant.apache.org
> Subject: Embedded dynamic ANT tasks.
> 
> 
> Dear ANT community,
> 
> I thought one day: maybe it would be fun if I could define 
> ANT tasks INSIDE
> the  ANT  script that is being executed? So it could look like this:
> 
> > <!-- Define an embedded task and use it immediately -->
> > <target name="example" depends="prepare">
> > 
> >     <!-- define the task -->
> >     <embeddedtaskdef name="counterTask"><![CDATA[
> >         String message;
> >         int    min;
> >         int    max;
> >         
> >         void setMin(int min) {
> >             // note how 'global' is used instead of 'this'
> >             // global scope refers to the task instance anyway.
> >             global.min = min;
> >         }
> > 
> >         void setMax(int max) {
> >             global.max = max;
> >         }
> > 
> >         void setMessage(String message) {
> >             global.message = message;
> >         }
> > 
> >         void execute() {
> >             if (message != null)
> >                 System.out.print(message);
> >             for (int i=min;i<max;i++) {
> >                 System.out.print(i);
> >                 if (i+1 != max) System.out.print(",");
> >             }
> >         }
> >     ]]></embeddedtaskdef>
> >     
> >     <!-- use the defined task right away! -->
> >     <counterTask min="0" max="10" message="The numbers from 
> 0 to 10 are: "
> />
> >     <counterTask min="5" max="20" message="And the numbers 
> from 5 to 20
> are: " />
> > </target>
> 
> 
> I've played with BSH and BCEL and the solution can be found at:
> 
> http://www.cs.put.poznan.pl/dweiss/index.php/projects/bsh-bind
ing/index.xml?
lang=en

I  personally find it quite a useful task, even though it started purely as
a toy and a mind-exerciser :)

Regards,
Dawid

_______________________
Dawid Weiss, http://www.cs.put.poznan.pl/dweiss
Laboratory of Intelligent Decision Support Systems, Poznan UT, Poland


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to