Java Mailing List Archive

http://www.ant-tasks.com/

Apache Ant Archive

» Ant Users List
» Ant Developers List
Invoking a target (Ant 1.7) in a loop (Ant-Contrib)

Invoking a target (Ant 1.7) in a loop (Ant-Contrib)

2007-01-17       - By Rebo, Alex
Reply:     1     2     3     4     5     6     7     8     9     10     >>  

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.

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:stevel@(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: user-unsubscribe@(protected)
For additional commands, e-mail: user-help@(protected)

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@(protected)
For additional commands, e-mail: user-help@(protected)


©2008 ant-tasks.com - Jax Systems, LLC, U.S.A.