On the bright side, using only id works as expected...
That brings to my next question: how can a limited number of services
implementing the same interface can be advised ?
I have now that "ServiceUpdater is matched by 4 services: AmazonServiceUpdater,
DoodleServiceUpdater, OSServiceUpdater, ServiceUpdaterCache"
And I want to advice only AmazonServiceUpdater and OSServiceUpdater.
Can I use regex on service id ?
I tried something like @Advise(id = "[OS|Amazon]ServiceUpdater") with
no luck, and cannot use @Advise(id = "*ServiceUpdater") (otherwise I go the
DoodleServiceUpdater too, which is wrong)
I can refactor the code and provide only one method like
buildTheServiceUpdater(..) and the use @Advise(id = "TheServiceUpdater"), but
that might prevent me in the future to instantiate easily the two services
separately.
-- Alessio
On Oct 3, 2013, at 5:10 PM, Alessio Gambi wrote:
>> Could you please file a JIRA?
>
> Here we go: TAP5-2195
>
>
>
>
>
> On Oct 2, 2013, at 8:37 PM, Thiago H de Paula Figueiredo wrote:
>
>> On Wed, 02 Oct 2013 11:49:54 -0300, Alessio Gambi <[email protected]>
>> wrote:
>>
>>> From the documentation (see
>>> http://tapestry.apache.org/service-advisors.html), it seems to be legal to
>>> combine the Advice and Match annotations:
>>>
>>> @Advise(serviceInterface=MyService.class)
>>> @Match("*DAO")
>>> public static void byMatchAnnotation(MethodAdviceReceiver receiver)
>>
>> This looks to me like a bad copy and paste from the previous example which
>> forgot to delete the @Match annotation.
>>
>>>> I'd vote for misuse. :P
>>> Than the documentation should be updated.
>>
>> Yep. And the code fixed to either make it work or to throw an exception when
>> both annotations are used in the same method.
>>
>>> public static ServiceUpdater buildOSServiceUpdater
>>> public static ServiceUpdater buildAmazonServiceUpdater
>>> public ServiceUpdaterCache buildServiceUpdaterCache
>>>
>>> Where the interface ServiceUpdaterCache extends ServiceUpdater.
>>>
>>> Therefore I should have 3 different services whose service-ids are:
>>>
>>> OSServiceUpdater
>>> AmazonServiceUpdater
>>> ServiceUpdaterCache
>>>
>>> Thus by declaring the following annotations
>>>
>>> 1) @Advise(serviceInterface = ServiceUpdater.class)
>>> 2) @Advise(id = "ServiceUpdater", serviceInterface = ServiceUpdater.class)
>>> 3) @Advise(id = "OSServiceUpdater", serviceInterface = ServiceUpdater.class)
>>>
>>> I expect the following outcomes:
>>>
>>> 1) That all three services (at least the 2 that are actually invoked at
>>> runtime) get the same advice
>>> 2) No service get the advice, as no one has matching service id
>>> 3) Only the OSServiceUpdater gets the advice.
>>>
>>>
>>> But what I actually get is:
>>>
>>> 1) Ok: both OSServiceUpdater and ServiceUpdaterCache get the advice
>>> 2) NOT OK: both OSServiceUpdater and ServiceUpdaterCache get the advice,
>>> while none should
>>> 3) NOT OK: both OSServiceUpdater and ServiceUpdaterCache get the advice,
>>> while only OSServiceUpdater should
>>
>> It seems that the code handling @Advise is ignoring id when serviceInterface
>> is set. I think Tapestry-IoC shouldn't let both attributes (id and
>> serviceInterface) to be used at the same time. It doesn't make sense.
>>
>> Could you please file a JIRA? And thank you very much for reporting and
>> investigating this issue. ;) That's a very good way of contributing to the
>> project. :)
>>
>> --
>> Thiago H. de Paula Figueiredo
>>
>> ---------------------------------------------------------------------
>> 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]
>