Yes, I think that I added the null return to allow local properties.

Peter


On Tue, Sep 1, 2009 at 1:08 PM, Matt Benson<gudnabr...@yahoo.com> wrote:
>
>
> --- On Tue, 9/1/09, Stefan Bodewig <bode...@apache.org> wrote:
>
>> From: Stefan Bodewig <bode...@apache.org>
>> Subject: PropertyHelper API
>> To: dev@ant.apache.org
>> Date: Tuesday, September 1, 2009, 4:59 AM
>> Hi
>>
>> I'm trying to grok the changes to the PropertyHelper in
>> order to
>> document them for 1.8.0 - and maybe to suggest throwing in
>> some more
>> built-in delegates, but that's for a different thread.
>>
>> From what I understand:
>>
>> The default PropertyHelper splits its work into several
>> steps that can
>> be delegated to custom implementations.  These steps
>> are:
>>
>>   * finding a property reference inside a string.
>>
>>     The delegate interface is
>> oata.property.PropertyExpander.
>>
>>     There are two built-in expanders, one that
>> finds ${foo} positions
>>     the parser after the '}' and says "here is
>> property "foo"' and one
>>     that finds $$, positions the parser after the
>> second $ (actually at
>>     the second $) and says "no property to be
>> seen here".
>>
>>     This is the interface I'd implement if I
>> wanted a completely
>>     different property syntax.  I'd also
>> need to implement it if I
>>     wanted to allow nested properties ${${foo}}
>> since the default
>>     PropertyExpander doesn't balance braces.
>
> Note that the props antlib does provide a NestedPropertyExpander, so you're 
> right on track.
>
>>
>>   * mapping a property to a value
>>
>>     The delegate interface is
>> oata.PropertyHelper.PropertyEvaluator.
>>
>>     There are two built-in implementations, one
>> implements local
>>     properties and one implements the "toString:
>> protocol",
>>     i.e. ${toString:some-refid} =>
>> find-reference-in-project.toString()
>>
>>     This is the interface I'd implement if I
>>
>>     - want to provide a different "protocol" like
>> toString:
>>
>>     - want to provide a different storage for
>> properties, this would be
>>       the reading part of it.
>>
>>     "Normal" project properties are not
>> implemented via
>>     PropertyEvaluator but implemented via
>> fallback mechanisms in the
>>     default PropertyHelper implementation.
>>
>>     PropertyEvaluator can return Object but it
>> will be turned into a
>>     String unless the whole string that was
>> expanded is consumed by the
>>     property (i.e. "${foo}" can become an Object
>> while "${foo} bar" van
>>     not).
>>
>>     PropertyEvaluator can return an instance of
>> the magical
>>     oata.property.NullReturn class which means "I
>> really really mean it
>>     when I say the property expands to null"
>> because simply returning
>>     null means "I don't know this property".
>>
>>   * storing the value for a property somewhere
>>
>>     The delegate interface is
>> oata.PropertyHelper.PropertySetter.
>>
>>     The only built-in implementation is for local
>> properties.
>>
>>     This is the interface I'd implement if I
>>
>>     - want to provide a different storage for
>> properties, this would be
>>       the writing part of it.
>>
>>     "Normal" project properties are not
>> implemented via
>>     PropertySetter but implemented via fallback
>> mechanisms in the
>>     default PropertyHelper implementation.
>>
>>     PropertySetter returns a flag indicating
>> whether it has consumed the
>>     property - otherwise the other delegates are
>> consulted and
>>     ultimately the fallback to project properties
>> is used.
>>
>> The <properthelper> task can be used to register
>> custom delegates.
>> Delegates are used in LIFO order that is custom delegates
>> are able to
>> override built-in delegates.
>>
>> Is this correct and somewhat complete (Matt?)?
>>
>
> The NullReturn thing, IIRC, was added by Peter.  But I think you're correct 
> about it.  Everything else sounds correct and complete as well; my proverbial 
> hat is off to you for having compiled this comprehensive piece of 
> documentation.
>
> -Matt
>
>> Stefan
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
>> For additional commands, e-mail: dev-h...@ant.apache.org
>>
>>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
> For additional commands, e-mail: dev-h...@ant.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
For additional commands, e-mail: dev-h...@ant.apache.org

Reply via email to