> From: peter reilly [mailto:[EMAIL PROTECTED] 
> 
> I would rather have Jose's idea of a <local-property/>
> task.
> 
> This could be used outside of macrodef.
> 
> The only problem is the implementation.
> 

Indeed, there is an easy implementation but will not solve the
case of <parallel>, because the local definition would really be a
temporary global one:

public class LocalProperty extends Sequential {
  private String property;
  private String oldValue;

  public setName(String i_property){property = i_property;}

  public void execute() {
    if (property == null) throw new BuildException("name attribute is
mandatory");
    try {
      oldValue = getProject().getProperty(property);
      getProject().setProperty(property, null); // This may need changes
to core
      super.execute();
    }
    finally {
      // This is using the deprecated setProperty method 
      // that actually changes the properties even if set
      getProject().setProperty(property, oldValue);
    }
  }
}

Here we just change the property value on the project frame, for the
duration
of the task. And put the old value back before we leave.

The problem with this simple implementation is that all the parallel
branches
will see the change, which is exactly what we were trying to avoid. To
do it
right, we would need to create a new execution frame that would be use
in the
"super" call.

But if we do that (which is like what <ant> or <antcall> do), what
happens
if the user defines properties other than the local-property inside the
code?
Somehow, we would need to find them and propagate them back to the frame
above
upon exit.

  <local-property name="x">
   <property name="y" value="myY"/>
  <local-property>
  <echo message="${y}"/>

[echo] myY

Doable, but not that easy anymore.

What do you guys think?

Jose Alberto


> Peter
> On Friday 17 October 2003 17:02, Shatzer, Larry wrote:
> > Maybe allow <attribute> have another <attribute> that 
> allows it to be 
> > undeclared with default or passed in, so we can set it inside the 
> > macrodef, such as "newcurrent".
> >
> > Example:
> >
> > <macrodef name="recursive">
> >   <attribute name="until"/>
> >   <attribute name="current"/>
> >   <attribute name="method"/>
> >   <attribute name="newcurrent" staticscope="true"/>
> >   ...
> > </macrodef>
> >
> > Then when you call "recursive" such as this: <recursive until="10" 
> > current="0" method="blah"/> it won't die that you did not pass 
> > "newcurrent".
> >
> > the "staticscope" attribute name could be something else, or 
> > scope="static" and a list of others that could be used.
> >
> > -- Larry
> >
> > > -----Original Message-----
> > > From: peter reilly [mailto:[EMAIL PROTECTED]
> > > Sent: Friday, October 17, 2003 12:43 AM
> > > To: Ant Developers List
> > > Subject: Re: Macrodef and parallel in a recursive situation
> > >
> > >
> > > The parellel would cause grief.
> > > The problem is not the attribute, I think
> > > but the "newcurrent" global "variable".
> > >
> > > On using macrodef, I have noticed that
> > > it would be really cool to have a static scopped
> > > variable.
> > >
> > > Peter
> >
> > 
> ---------------------------------------------------------------------
> > 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