Another option is to use ant-contrib's Variable task, which is a mutable
property. It is in the 0.6 ant-contrib release.

Dale


Stirling, Scott wrote:
> Hi,
> 
> I am writing to share my workaround for a gotcha I encountered with the latest 
> ant-contrib <for> tak (version 0.6) and some standard Ant tasks.  And if anyone has 
> a better workaround/solutions, please let me know.
> 
> Consider a <for> loop like this, which does the following:
> - loops over a fileset in a path
> - derives the basename of each non-ejb jar in the fileset
> - echoes the base jar name + a space char to a file that is later read-in to create 
> the ClassPath entry for the EJB jars manifest (not shown)
> 
> <for param="nonejbjar">
>   <path>
>     <fileset dir="${ear.root}">
>       <include name="*.jar"/>
>       <exclude name="*-ejb*.jar"/>
>     </fileset>
>   </path>
>   <sequential>
>     <!-- note the tricky ($) property 
>      and (@) property use to uniquify the
>      basename property each time through the 
>      loop -->
>     <basename property="[EMAIL PROTECTED]"
>               file="@{nonejbjar}"/>
>     <echo append="true" 
>           file="${assembler.cache}/manifest.generated"
>           message="[EMAIL PROTECTED] "/>
>   </sequential>
> </for>
> 
> The comment points out the tricky thing I had to learn today, which is that <for> 
> can have interesting side-effects when used with tasks that create properties.  
> Which essentially makes certain tasks unusable with the <for> task, or requires a 
> tricky workaround.
> 
> There's the trick I used for the <basename> task: each time through the loop, the 
> current value of @{nonejbjar} (from the fileset) is appended to the 
> ${non.ejb.jar.name} property name, which tells basename to create a uniquely named 
> property each time through the loop.  Here the property name is only used in the 
> loop to dereference the value in the <echo> task, so it doesn't matter what the name 
> really is.  Note the nested [EMAIL PROTECTED] syntax to dereference the Ant property 
> and the macrodef attribute.
> 
> One alternative I considered was writing a regular expression using ant-contrib's 
> <propertyregex> instead of using the <basename> task.  This task allows for 
> overriding the property name if it is already set.  But then I found this was easier 
> and a more general solution.
> 
> An "override" attribute for some property-creating tasks like <basename> would be 
> pretty handy, I think.
> 
> Regards,
> Scott Stirling
> 
> ***********************************************************************
> This message is intended only for the use of the intended recipient and
> may contain information that is PRIVILEGED and/or CONFIDENTIAL.  If you
> are not the intended recipient, you are hereby notified that any use,
> dissemination, disclosure or copying of this communication is strictly
> prohibited.  If you have received this communication in error, please
> destroy all copies of this message and its attachments and notify us
> immediately.
> ***********************************************************************
> 
> 
> ---------------------------------------------------------------------
> 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