Jose makes a good point about tasks that set
properties.  Without having delved into the
PropertyHelper* classes, could local properties be
handled some other way?  What about a Scope
TaskContainer subclass that would push an element onto
a stack.  Then any property queries would descend into
the stack... then a task that set a property could
have that property restricted by nesting it in a set
of <scope> tags...

-Matt


--- Jose Alberto Fernandez <[EMAIL PROTECTED]>
wrote:
> > From: Christopher Lenz [mailto:[EMAIL PROTECTED] 
> > 
> > Hi Peter,
> > 
> > this looks really cool, but I'd suggest adding an
> attribute like 
> > scope="local|global" to the <property> task
> instead of adding 
> > a completely 
> > new task.
> > 
> 
> I disagree here. The issue is not <property> by
> itself. This local
> properties need to work with every <task> that may
> set a property:
> <condition>, <available>, <uptodate>, <property>,
> and a million more
> obscure ones. The main use for <local> is when it is
> called without
> the value attribute, because in that case this other
> tasks will
> set the local property and not the global one.
> 
> Jose Alberto
> 
> > -chris
> > 
> > peter reilly wrote:
> > > I have written the code to support local
> properties.
> > > While I was doing this, I realized that the
> attributes
> > > of a macrodef could/should be local properties
> as well, 
> > removing some 
> > > of the issues seen last week (use of attribute
> in a bsf script and 
> > > support of parallel/recursive).
> > > 
> > > The following shows it in using a new task
> called local.
> > > 
> > > <project name="local">
> > >   <property name="prop1" value="a global
> value"/>
> > >   <target name="test1">
> > >     <local name="prop1" value="a local value"/>
> > >     <echo>prop1 is "${prop1}"</echo>
> > >   </target>
> > >   <target name="test2" depends="test1">
> > >     <echo>prop1 is "${prop1}"</echo>
> > >   </target>
> > > </project>
> > > 
> > > This ant test2 generates the following:
> > > 
> > > test1:
> > > prop1 is "a local value"
> > > 
> > > test2:
> > > prop1 is "a global value"
> > > 
> > > Each taskcontainer sets up a new local scope:
> > > 
> > >   <target name="sequential">
> > >     <local name="prop2" value="in target"/>
> > >     <sequential>
> > >       <local name="prop2" value="in
> sequential"/>
> > >       <echo>prop2 is "${prop2}"</echo>
> > >     </sequential>
> > >     <echo>prop2 is "${prop2}"</echo>
> > >   </target>
> > > 
> > > will generate the following:
> > > sequential:
> > > prop2 is "in sequential"
> > > prop2 is "in target"
> > > 
> > > The value part of <local> is optional, and  the
> local 
> > property may be 
> > > set by a subsequent <property>, <property> will
> only set it if the 
> > > value is not set.
> > > 
> > >   <target name="notset">
> > >     <local name="prop3"/>
> > >     <echo>prop3 is "${prop3}"</echo>
> > >     <property name="prop3" value="is set"/>
> > >     <property name="prop3" value="is set
> again"/>
> > >     <echo>prop3 is "${prop3}"</echo>
> > >   </target>
> > > 
> > > will generate the following:
> > > notset:
> > > prop3 is "${prop3}"
> > > prop3 is "is set"
> > > 
> > > prop3 is still a local variable and will not be
> seen outside the 
> > > target.
> > > 
> > > The local properties are thread local so the
> following 
> > works as expected:
> > >   <target name="parallel">
> > >     <local name="prop4"/>
> > >     <parallel>
> > >       <sequential>
> > >         <property name="prop4" value="thread1"/>
> > >         <echo>t1: prop4 is "${prop4}"</echo>
> > >       </sequential>
> > >       <sequential>
> > >         <property name="prop4" value="thread2"/>
> > >         <echo>t2: prop4 is "${prop4}"</echo>
> > >       </sequential>
> > >       <sequential>
> > >         <property name="prop4" value="thread3"/>
> > >         <echo>t3: prop4 is "${prop4}"</echo>
> > >       </sequential>
> > >     </parallel>
> > >   </target>
> > > 
> > > parallel:
> > > t2: prop4 is "thread2"
> > > t1: prop4 is "thread1"
> > > t3: prop4 is "thread3"
> > > 
> > > Use with macrodef.
> > > -----------------
> > > 
> > > Attributes may now be implemented as local
> properties, which means 
> > > that they will be seen as normal properties by
> ant tasks - 
> > including 
> > > script.
> > > 
> > >   <target name="macro">
> > >     <macrodef name="callscript">
> > >       <attribute name="x"/>
> > >       <sequential>
> > >         <script language="beanshell">
> > >           System.out.println("x is '" + 
> > project.getProperty("x") + "'");
> > >         </script>
> > >       </sequential>
> > >     </macrodef>
> > > 
> > >     <callscript x="this is x"/>
> > >   </target>
> > > 
> > > will generate:
> > > macro:
> > > x is 'this is x'
> > > 
> > > Macrodef does not do the attribute substitutions
> so the following
> > >   <target name="macro2">
> > >     <macrodef name="callscript">
> > >       <attribute name="x"/>
> > >       <sequential>
> > >         <script language="beanshell">
> > >           System.out.println("x is '${x}'");
> > >         </script>
> > >       </sequential>
> > >     </macrodef>
> > > 
> > >     <callscript x="this is x"/>
> > >   </target>
> > > will generate:
> > > macro2:
> > > x is '${x}'
> > > as <script/> does not do property expansion.
> > > 
> > > A variation of the recurive macrodef last week
> may be done by:
> > >   <target name="recur">
> > >     <macrodef name="recur">
> > >       <attribute name="thread"/>
> > >       <attribute name="current"/>
> > >       <sequential>
> > >         <antcontrib:if>
> > >           <equals arg1="0" arg2="${current}"/>
> > >           <then>
> > >             <echo message="Thread: ${thread}
> done"/>
> > >           </then>
> > >           <else>
> > >             <antcontrib:math
> > >               datatype  = "int"
> > >               operand1  = "${current}"
> > >               operation = "-"
> > >               operand2  = "1"
> > >               result    = "current"
> > >               />
> > >             <echo message = "T: ${thread}, C:
> ${current}" />
> 
=== message truncated ===


__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com

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

Reply via email to