---------- Forwarded message ----------
From: Peter Reilly <[EMAIL PROTECTED]>
Date: Jan 17, 2007 6:55 PM
Subject: Re: Invoking a target (Ant 1.7) in a loop (Ant-Contrib)
To: "Rebo, Alex" <[EMAIL PROTECTED]>


On 1/17/07, Rebo, Alex <[EMAIL PROTECTED]> wrote:
So many thanks, Peter!

One "smart" Q, however:
Ability to provide qualified name space,
such as in
<ac:for ...

</ac:for>,

should be granted by smth like:

xmlns:ac="antlib:net.sf.antcontrib"

Where that "smth" should be specified, provided my reference to antcontrib
is set (per installation instructions):

        <taskdef resource="net/sf/antcontrib/antlib.xml">
                <classpath>
                        <pathelement
location="/app/java/ant-contrib/ant-contrib-1.0b3.jar"/>
                </classpath>
        </taskdef>
?

Use the uri attribute of (type/task)def, for example:

 <typedef uri="antlib:net.sf.antcontrib"
          resource="net/sf/antcontrib/antlib.xml">
   <classpath>
     <fileset dir="${basedir}/lib/ant/ant-contrib" includes="*.jar"/>
   </classpath>
 </typedef>

 <ac:for xmlns:ac="antlib:net.sf.antcontrib" param="p" list="a,b,c">
   <sequential>
      <echo>p is @{p}</echo>
   </sequential>

In ant 1.7.0, one can drop the resource, for example:
 <typedef uri="antlib:net.sf.antcontrib"
              classpath="/app/java/ant-contrib/ant-contrib-1.0b3.jar"/>

peter


</

-----Original Message-----
From: Peter Reilly [mailto:[EMAIL PROTECTED]
Sent: Wednesday, January 17, 2007 12:18
To: Ant Users List
Subject: Re: Invoking a target (Ant 1.7) in a loop (Ant-Contrib)


On 1/17/07, Rebo, Alex <[EMAIL PROTECTED]> wrote:
> Thank you, Steve!
>
> The idea was to "unload" the heavy construct such as:
> <target name="selfCheck">
>         ...
>         <if>
>                 <equals arg1="${doNotHaveCheckSums}"    arg2="true"     />
>                 <then>
>                         <for    param="fileToWorkOn">
>                                 <path>
>                                         <fileset refid="extentionLibs" />
>                                 </path>
>                                 <sequential>
>                                         <checksum
> file="@{fileToWorkOn}"  algorithm="MD5" />
>                                         <echo>
>                                                         Created checksum
> file for @{fileToWorkOn}.
>                                         </echo>
>
>                                 </sequential>
>                         </for>
>                 </then>
>                 <else>
>                         <for    param="fileToWorkOn">
>                                 <path>
>                                         <fileset refid="extentionLibs" />
>                                 </path>
>                                 <sequential>
>                                         <checksum
> file="@{fileToWorkOn}"  verifyProperty="doesCheckSumMatch"      />
>                                         <fail   message="Checksum
> verification failed for @{fileToWorkOn}.">
>                                                 <condition>
>                                                         <equals
> arg1="${doesCheckSumMatch}"     arg2="false"    />
>                                                 </condition>
>                                         </fail>
>
>                                 </sequential>
>                         </for>
>                 </else>
>         </if>
>         <echo>
>                 "Self check done."
>         </echo>
> </target>
>
>
> with:
>
> <target name="selfCheck">
>         ...
>         <if>
>                 <equals arg1="${doNotHaveCheckSums}"    arg2="true"     />
>                 <then>
>                         <foreach        target="computeCheckSum"
> param="fileToWorkOn"    inheritall="true">
>                                 <path>
>                                         <fileset refid="extentionLibs" />
>                                 </path>
>                         </foreach>
>                 </then>
>                 <else>
>                         <foreach        target="verifyCheckSum"
> param="fileToWorkOn"    inheritall="true">
>                                 <path>
>                                         <fileset refid="extentionLibs" />
>                                 </path>
>                         </foreach>
>                 </else>
>         </if>
>         <echo>
>                 "Self check done."
>         </echo>
> </target>
>
>
> <target name="computeCheckSum"  if="doNotHaveCheckSums">
>         <checksum       file="${fileToWorkOn}"  algorithm="MD5" />
>                 <echo>
>                         Created checksum file for ${fileToWorkOn}.
>                 </echo>
> </target>
>
> <target name="verifyCheckSum"   unless="doNotHaveCheckSums">
>         <checksum       file="${fileToWorkOn}"
> verifyProperty="doesCheckSumMatch"      />
>         <fail   message="Checksum verification failed for
${fileToWorkOn}.">
>                 <condition>
>                         <equals arg1="${doesCheckSumMatch}"
arg2="false"
> />
>                 </condition>
>         </fail>
> </target>
>
> In my mind the "if-then-else" block looks cleanly this way.
> On top, target contra to macrodef can be executed conditionally
> (if/unless)
>
> You are correct pointing out that if a target can't be invoked all by
itself
> (answer to your Q: "do you ever execute ant using that as a target or is
it
> a utility type thing?"
> is "No") it should be a target.
> Per Dominique's suggestion I replaced "foreach" with "for" thus loosing
the
> ability
> to call a target within loops body.
> If I can figure out how to put macrodefs in place of a target, I might try
> to "unload" the body of the loop.

You can use the ac:runtarget to call a target within the
same project, but you have to be careful to handle
properties carefully.

In my current project, I use something like
this:
  <target name="clean-start" depends="clean">
    <ac:var name="db.auto" value="create-drop"/>
    <ac:runtarget target="unexplode"/>
    <ac:runtarget target="restart"/>
  </target>

In your target:

 <target name="computeCheckSum"  if="doNotHaveCheckSums">
       <checksum       file="${fileToWorkOn}"  algorithm="MD5" />
               <echo>
                       Created checksum file for ${fileToWorkOn}.
               </echo>
</target>

There are two params: doNotHaveCheckSums and fileToWorkOn,
it would make more sense to convert this to a macro

It looks like doNotHaveChecksSums is global and checked before
the target is called and fileToWorkOn is
local so the macro would look something like this:

So I would do:

<macrodef name="computeCheckSum">
    <attribute name="fileToWorkOn"/>
     <sequential>
        <checksum       file="@{fileToWorkOn}"  algorithm="MD5" />
         <echo>
                       Created checksum file for @{fileToWorkOn}.
         </echo>
    </sequential>
</target>

<macrodef name="verifyCheckSum">
   <attribute name="fileToWorkOn"/>
   <sequential>
       <ac:var name="doesCheckSumMatch" unset="yes"/>
       <checksum       file="@{fileToWorkOn}"
                             verifyProperty="doesCheckSumMatch"      />
       <fail   message="Checksum verification failed for @{fileToWorkOn}.">
           <condition>
               <equals arg1="${doesCheckSumMatch}"     arg2="false"
                />
           </condition>
      </fail>
   </sequential>
<macrodef>

So I would do:

 <target name="selfCheck">
    <ac:for param="fileToCheck">
        <fileset refid="extentionLibs" />
        <seqential>
           <ac:if>
               <equals arg1="${doNotHaveCheckSums}"    arg2="true"     />
                <then>
                     <computeCheckSum fileToCheck="@{fileToCheck}"/>
                </then>
                <else>
                     <verifyCheckSum filetoCheck="@{fileToCheck}"/>
                </else>
           </ac:if>
        </sequential>
    </ac:for>
</target>

However as Steve says, most ant tasks are meant to
work on filesets/paths, and normally would have built-in iterator/dependence
checking, so in general and if possible one should see it that
tasks themselves can be used to to the iteration.

Peter
>
> Do you think it's worse the effort, Steve?
>
> PS.: Could you, please, elaborate on "In Ant 1.7, many support resources,
> which provides you
> even more ways to source data."?
>
> -----Original Message-----
> From: Steve Loughran [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, January 17, 2007 06:02
> To: Ant Users List
> Subject: Re: Invoking a target (Ant 1.7) in a loop (Ant-Contrib)
>
>
> Rebo, Alex wrote:
> > Hello!
> >
> > In attempt to compute checksums for all files in a directory I wrote
this:
> >
> > <fileset id="myLibs" dir="${extention}">
> >     <include name="*.jar"/>
> > </fileset>
> >
> > .....
> >
> > <target name="thisTargetName">
> >     <foreach target="computeCheckSum" param="fileToWorkOn"
> > inheritall="true">
> >         <path>
> >             <fileset refid="myLibs" />
> >         </path>
> >     </foreach>
> > </target>
> >
> > ....
> >
> > <target name="computeCheckSum">
> >     <checksum file="${fileToWorkOn}" algorithm="MD5" />
> >     <echo>
> >         Created checksum file for ${fileToWorkOn}.
> >     </echo>
> > </target>
>
>
> I want to ask an even sillier question. why not just hand the entire
> fileset to <checksum>?
>
> <checksum algorithm="MD5" >
>         <fileset refid="myLibs" />
> </checksum>
>
> No macros, no iteration; ant does the bulk work with depdnency logic.
> See example 7 and 8 in the checksum page in teh manual.
>
> Remember: most Ant tasks are designed to work in bulk, with filesets or
> paths as params. In Ant 1.7, many support resources, which provides you
> even more ways to source data.
>
> -Steve
>
>
> ---------------------------------------------------------------------
> 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]


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

Reply via email to