[cdi-dev] Possible cycle with ProcessBeanAttributes only for enabled beans
Jozef Hartinger
jharting at redhat.com
Mon Jan 5 03:28:23 EST 2015
Let me clarify:
1) Determine what beans are enabled / disabled based on the deployment
information (ignore ProcessBeanAttributes.veto() for now) - this is the
same as what is done for ProcessBean in CDI 1.0
2) For each of these enabled beans fire ProcessBeanAttributes
3) If a veto action makes any previously disabled bean enabled, fire
ProcessBeanAttributes for it once this round of PBA firing finishes
4) Repeat 2-4 until all beans are processed
On 01/03/2015 10:39 PM, Mark Struberg wrote:
> But I CANNOT know if it is enabled before I fire ProcessBeanAttributes! Because this PBA#veto() has a huge impact on which class is enabled or not.
>
>
> And no, in CDI-1.0 there was only ProcessBean which did imo _not_ have a veto() method. This only got added with ProcessBeanAttributes, right?
>
>
> I think in practice this will rarely be an issue, but there are cases where it is not really deterministic but depending on the order in which the classes get processed.
>
>
> LieGrue,
> strub
>
>
>
>
>
>> On Friday, 2 January 2015, 8:40, Jozef Hartinger <jharting at redhat.com> wrote:
>>> You cannot just fire ProcessBeanAttributes the moment you run across
>> Bravo. You need to figure out whether it is specialized or not first
>> (which means processing Charlie). This is not new at all - this was the
>> case since CDI 1.0 with ProcessBean.
>>
>> As for the extension case the moment an extension vetoes BeanAttributes,
>> you should check whether that action makes any previously disabled beans
>> enabled. If so, fire ProcessBeanAttributes for them. Repeat untill all
>> beans are processed.
>>
>>
>> On 12/22/2014 06:58 PM, Mark Struberg wrote:
>>> The JavaDoc of ProcessBeanAttributes defines that ProcessBeanAttributes
>> must only get fired for ENABLED beans:
>>> "The container fires an event of this type for each enabled bean,
>> interceptor or decorator deployed in a bean archive before registering the Bean
>> object."
>>>
>>> The test
>>>
>>>
>> org.jboss.cdi.tck.tests.extensions.lifecycle.processBeanAttributes.specialization.SpecializationTest
>>> has a nice example
>>>
>>>
>>> @Specializes class Charly extends
>>> -> @Specializes class Bravo extends
>>> -> class Alpha
>>>
>>> Which ProcessBeanAttributes events would you except to get fired?
>>> *) Alpha? No, because it's specialized away (5.1.2. Enabled and
>> disabled beans).
>>> *) Bravo? No, because it's specialized away as well, right?
>>> *) Charly? Yes, because that's the only _enabled_ bean!
>>>
>>>
>>> So far, so clear. But now comes the tricky part!
>>>
>>> This test also has an Extension which observes ProcessBeanAttributes and
>> disables Charly.
>>> This means that finally Bravo is enabled, Charly disabled (is there
>> actually a difference btw disabled and vetoed spec wording wise?)
>>> The problem is now that we only know this AFTER the ProcessBeanAttributes
>> for Charly got fired. And this introduces an ordering issue:
>>> If the BeanAttributes for Bravo gets scanned BEFORE the ones of Charly,
>> then we do not know YET that Charly will get disabled. Thus we fire the
>> ProcessBeanAttributes for Bravo as well. But as we know that should not happen!
>>> Otoh if Charly gets scanned first, then Bravo will not get processed.
>>>
>>>
>>> Can you follow me?
>>>
>>>
>>> LieGrue,
>>> strub
>>> _______________________________________________
>>> cdi-dev mailing list
>>> cdi-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>
>>> Note that for all code provided on this list, the provider licenses the
>> code under the Apache License, Version 2
>> (http://www.apache.org/licenses/LICENSE-2.0.html). For all other ideas provided
>> on this list, the provider waives all patent and other intellectual property
>> rights inherent in such information.
>>
More information about the cdi-dev
mailing list