Re: [weld-dev] AfterBeanDiscovery and observer resolver cache

2014-03-19 Thread Martin Kouba
Hi Christian,

in CDI 1.1 you can use the EventMetadata interface [1]. But it's not
possible to inspect metadata in a custom observer notify() method. At
some point, there was a notify(T event, SetAnnotation qualifiers)
method, but it was removed because of backwards compatibility [2].

M

[1]
http://docs.jboss.org/cdi/spec/1.1/cdi-spec.html#event_metadata
[2]
https://issues.jboss.org/browse/CDI-281


Dne 19.3.2014 19:46, Christian Sadilek napsal(a):
 Hi guys,
 
 I have to follow up on this because our proposed solution using a single 
 ObserverMethod for @Any and Object.class won't work. The problem is that the 
 notify() method will only provide the event object but not its actual 
 qualifiers. So, I won't be able to dispatch to the corresponding observers 
 since I don't know which qualifiers the event actually has.
 
 So, taking away the ability to register observer methods on ABD after the 
 bootstrap process will cause a critical problem for us that is not resolvable.
 
 Is it possible to enhance or overload notify() in ObserverMethod to contain 
 the actual set of qualifiers as parameter (I think providing this metadata 
 would be good from an API perspective anyway)?
 
 If that's not possible, can we rethink the options I listed below for 
 clearing the observer caches?
 
 Can you think of other solutions?
 
 Thanks,
 Christian
 
 On 2014-03-06, at 10:11 AM, Martin Kouba mko...@redhat.com wrote:
 
 Dne 6.3.2014 15:51, Christian Sadilek napsal(a):
 Hi guys,

 Fair enough. This is the outcome I expected. I do think, however, that
 the docs for ABD need some clarification here and ideally the ABD
 instance should be deactivated once the bootstrap process finished so
 it can throw an exception when e.g. addObserverMethod is invoked too
 late in the game (better than silently having no effect).

 +1
 I've created https://issues.jboss.org/browse/CDI-425 to address this issue.


 Thanks for your answers!

 Cheers,
 Christian

 On 2014-03-06, at 5:24 AM, Jozef Hartinger jhart...@redhat.com
 mailto:jhart...@redhat.com wrote:

 Yes, I don't think Errai should depend on this behavior as it is not
 even in the undefined category but rather in implicitly not
 allowed or not the intention of the spec category.

 Even from the Weld point of view we use two levels of caching and
 while clearing the main one is easy, dealing with the second layer
 would require adding further complexity just to support this corner case.

 Therefore, I would suggest to use the other approach you proposed
 where you register a general observer method and dispatch to the
 dynamically added observers within there. It is always hard to guess
 performance implications without doing measurements but as long as the
 general observer method implementation is efficient, I would not worry
 about that one additional method invocation much.

 Jozef

 On 03/06/2014 10:04 AM, Mark Struberg wrote:
 Hi Christian!

 While I find it nice that this works with OWB I also have to agree
 that this is not a guaranteed behaviour by the spec intention.
 What you could do in to hack around this issue is to have an
 @Observes@Any  Object method which delivers the events with your own
 dynamic rules.
 But be prepared that this might slow down your app a bit.

 LieGrue,
 strub



 On Wednesday, 5 March 2014, 17:04, Christian Sadilek
 csadi...@redhat.com wrote:

Hi,

Yes, I expected this to not be an officially supported use case.
So, I guess it's just a matter of improving the API
design/documentation.

However, dynamically registering an observer method would really
be useful in the case of Errai where we set up an event bridge
between the server and the client and potentially discover new
observers at runtime.

We could work around this by registering an observer method that
observes all events and then handle the dispatching internally
but that seems less efficient. Right now this works because
OpenWebBeans doesn't cache the observers and allows invocations
to AfterBeanDiscovery.addObserverMethod at runtime and because
Weld has the functionality to clear the observer cache (although
that's not public API).

My questions is: Is there a good reason not to support this going
forward? Can we add alternative functionality to add observer
methods at runtime (not using ABD)?

Cheers,
Christian

On 2014-03-05, at 4:37 AM, Martin Kouba mko...@redhat.com
mailto:mko...@redhat.com wrote:

 FYI I've informed CDI EG and it will be discussed on the next
meeting
 whether to clarify this already in CDI 1.2 MR...

 M

 Dne 5.3.2014 10:19, Jozef Hartinger napsal(a):
 Agreed. It is definitely not the intention of the
specification to allow
 beans/observers/contexts to be added at runtime and
applications should
 not have any expectations of what these methods do when
invoked outside
 of the AfterBeanDiscovery observer.

 We'll add stricter validation to Weld to disallow 

Re: [weld-dev] AfterBeanDiscovery and observer resolver cache

2014-03-19 Thread Christian Sadilek
Thanks, Martin!

So, using @Observes (with an EventMetadata parameter) instead of a custom 
ObserverMethod is the way to go then for our CDI extension. Jozef's idea of 
having a subinterface with the overloaded notify method to avoid breaking 
backward compatibility would have been a nice solution though :).

Cheers,
Christian

On 2014-03-19, at 4:50 PM, Martin Kouba mko...@redhat.com wrote:

 Hi Christian,
 
 in CDI 1.1 you can use the EventMetadata interface [1]. But it's not
 possible to inspect metadata in a custom observer notify() method. At
 some point, there was a notify(T event, SetAnnotation qualifiers)
 method, but it was removed because of backwards compatibility [2].
 
 M
 
 [1]
 http://docs.jboss.org/cdi/spec/1.1/cdi-spec.html#event_metadata
 [2]
 https://issues.jboss.org/browse/CDI-281
 
 
 Dne 19.3.2014 19:46, Christian Sadilek napsal(a):
 Hi guys,
 
 I have to follow up on this because our proposed solution using a single 
 ObserverMethod for @Any and Object.class won't work. The problem is that the 
 notify() method will only provide the event object but not its actual 
 qualifiers. So, I won't be able to dispatch to the corresponding observers 
 since I don't know which qualifiers the event actually has.
 
 So, taking away the ability to register observer methods on ABD after the 
 bootstrap process will cause a critical problem for us that is not 
 resolvable.
 
 Is it possible to enhance or overload notify() in ObserverMethod to contain 
 the actual set of qualifiers as parameter (I think providing this metadata 
 would be good from an API perspective anyway)?
 
 If that's not possible, can we rethink the options I listed below for 
 clearing the observer caches?
 
 Can you think of other solutions?
 
 Thanks,
 Christian
 
 On 2014-03-06, at 10:11 AM, Martin Kouba mko...@redhat.com wrote:
 
 Dne 6.3.2014 15:51, Christian Sadilek napsal(a):
 Hi guys,
 
 Fair enough. This is the outcome I expected. I do think, however, that
 the docs for ABD need some clarification here and ideally the ABD
 instance should be deactivated once the bootstrap process finished so
 it can throw an exception when e.g. addObserverMethod is invoked too
 late in the game (better than silently having no effect).
 
 +1
 I've created https://issues.jboss.org/browse/CDI-425 to address this issue.
 
 
 Thanks for your answers!
 
 Cheers,
 Christian
 
 On 2014-03-06, at 5:24 AM, Jozef Hartinger jhart...@redhat.com
 mailto:jhart...@redhat.com wrote:
 
 Yes, I don't think Errai should depend on this behavior as it is not
 even in the undefined category but rather in implicitly not
 allowed or not the intention of the spec category.
 
 Even from the Weld point of view we use two levels of caching and
 while clearing the main one is easy, dealing with the second layer
 would require adding further complexity just to support this corner case.
 
 Therefore, I would suggest to use the other approach you proposed
 where you register a general observer method and dispatch to the
 dynamically added observers within there. It is always hard to guess
 performance implications without doing measurements but as long as the
 general observer method implementation is efficient, I would not worry
 about that one additional method invocation much.
 
 Jozef
 
 On 03/06/2014 10:04 AM, Mark Struberg wrote:
 Hi Christian!
 
 While I find it nice that this works with OWB I also have to agree
 that this is not a guaranteed behaviour by the spec intention.
 What you could do in to hack around this issue is to have an
 @Observes@Any  Object method which delivers the events with your own
 dynamic rules.
 But be prepared that this might slow down your app a bit.
 
 LieGrue,
 strub
 
 
 
 On Wednesday, 5 March 2014, 17:04, Christian Sadilek
 csadi...@redhat.com wrote:
 
   Hi,
 
   Yes, I expected this to not be an officially supported use case.
   So, I guess it's just a matter of improving the API
   design/documentation.
 
   However, dynamically registering an observer method would really
   be useful in the case of Errai where we set up an event bridge
   between the server and the client and potentially discover new
   observers at runtime.
 
   We could work around this by registering an observer method that
   observes all events and then handle the dispatching internally
   but that seems less efficient. Right now this works because
   OpenWebBeans doesn't cache the observers and allows invocations
   to AfterBeanDiscovery.addObserverMethod at runtime and because
   Weld has the functionality to clear the observer cache (although
   that's not public API).
 
   My questions is: Is there a good reason not to support this going
   forward? Can we add alternative functionality to add observer
   methods at runtime (not using ABD)?
 
   Cheers,
   Christian
 
   On 2014-03-05, at 4:37 AM, Martin Kouba mko...@redhat.com
   mailto:mko...@redhat.com wrote:
 
 FYI I've informed CDI EG and it will be discussed on the next
   meeting
 whether to 

Re: [weld-dev] AfterBeanDiscovery and observer resolver cache

2014-03-06 Thread Mark Struberg
Hi Christian!

While I find it nice that this works with OWB I also have to agree that this is 
not a guaranteed behaviour by the spec intention.
What you could do in to hack around this issue is to have an @Observes@Any  
Object method which delivers the events with your own dynamic rules.
But be prepared that this might slow down your app a bit.

LieGrue,
strub





On Wednesday, 5 March 2014, 17:04, Christian Sadilek csadi...@redhat.com 
wrote:
 
Hi,

Yes, I expected this to not be an officially supported use case. So, I guess 
it's just a matter of improving the API design/documentation.

However, dynamically registering an observer method would really be useful in 
the case of Errai where we set up an event bridge between the server and the 
client and potentially discover new observers at runtime.

We could work around this by registering an observer method that observes all 
events and then handle the dispatching internally but that seems less 
efficient. Right now this works because OpenWebBeans doesn't cache the 
observers and allows invocations to AfterBeanDiscovery.addObserverMethod at 
runtime and because Weld has the functionality to clear the observer cache 
(although that's not public API).

My questions is: Is there a good reason not to support this going forward? Can 
we add alternative functionality to add observer methods at runtime (not using 
ABD)?

Cheers,
Christian


On 2014-03-05, at 4:37 AM, Martin Kouba mko...@redhat.com wrote:

 FYI I've informed CDI EG and it will be discussed on the next meeting
 whether to clarify this already in CDI 1.2 MR...
 
 M
 
 Dne 5.3.2014 10:19, Jozef Hartinger napsal(a):
 Agreed. It is definitely not the intention of the specification to allow 
 beans/observers/contexts to be added at runtime and applications should 
 not have any expectations of what these methods do when invoked outside 
 of the AfterBeanDiscovery observer.
 
 We'll add stricter validation to Weld to disallow this.
 
 On 03/05/2014 08:53 AM, Martin Kouba wrote:
 Hi Christian,this
 
 actually invoking any container lifecycle event method after the
 container initialization finished should have no effect. ABD event
 reference can escape but it does not mean you can invoke ABD.addBean()
 after ADV is fired.
 
 The spec wording is not very explicit here:
 During the application initialization process, the container fires a
 series of events, allowing portable extensions to integrate with
 the container initialization process defined in Section 12.2.
 
 Maybe we should file a new spec issue to clarify that such invocations
 should result in IllegalStateException...
 
 Martin
 
 
 Dne 4.3.2014 17:42, Christian Sadilek napsal(a):
 Hi Jozef,
 
 I think clearing the cache at the end of the Weld bootstrap process is 
 not enough to solve that particular problem since a CDI extension can 
 hold on to the ABD reference and invoke addObserverMethod later (multiple 
 times) which causes the same problem I described below. There's no 
 indication to the caller of addObserverMethod that it's in fact too late 
 to call that method.
 
 Since an ABD event reference can always escape (can be used outside the 
 method that observes it) it seems this issue should be resolved (although 
 it admittedly is an edge case).
 
 Cheers,
 Christian
 
 On 2014-03-04, at 11:29 AM, Jozef Hartinger jhart...@redhat.com wrote:
 
 Hi Christian,
 
 this sounds like a bug. All the resolution caches should be cleared at 
 the very end of Weld's bootstrap sequence (after ABD observers are 
 called). (see 
 https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java#L415)
 
 Jozef
 
 On 03/04/2014 04:36 PM, Christian Sadilek wrote:
 Hi everyone,
 
 CDI extensions can observe the AfterBeanDiscovery event to register 
 observer methods (addObserverMethod). However, when an event is first 
 fired, the observers for that event are resolved and then cached (in 
 TypeSafeResolver). All future calls to addObserverMethod for an already 
 fired event with corresponding qualifiers will have no effect because 
 the observer result is read from cache and not recomputed.
 
 From an API perspective that's unfortunate because addObserverMethod 
 will only work until an event (with corresponding qualifiers) is fired 
 and there is no indication to the caller of that method that it didn't 
 have any effect when invoked after that.
 
 Possible solutions:
 
 - Provide some public API to clear/recompute that part the observer 
 cache. Maybe that exists? I couldn't find it which is why I am using 
 the private API and Reflection :(. Also let 
 AfterBeanDiscovery.addObserverMethod fail in that case with the advice 
 to reset the cache.
 
 - Recompute the corresponding part of the cache when addObserverMethod 
 is called (seems preferable).
 
 OpenWebBeans doesn't have this issue as their NotificationManager will 
 simply add the new ObserverMethod to a ConcurrentHashMap that is also 
 accessed when an 

Re: [weld-dev] AfterBeanDiscovery and observer resolver cache

2014-03-05 Thread Jozef Hartinger
Agreed. It is definitely not the intention of the specification to allow 
beans/observers/contexts to be added at runtime and applications should 
not have any expectations of what these methods do when invoked outside 
of the AfterBeanDiscovery observer.

We'll add stricter validation to Weld to disallow this.

On 03/05/2014 08:53 AM, Martin Kouba wrote:
 Hi Christian,

 actually invoking any container lifecycle event method after the
 container initialization finished should have no effect. ABD event
 reference can escape but it does not mean you can invoke ABD.addBean()
 after ADV is fired.

 The spec wording is not very explicit here:
 During the application initialization process, the container fires a
 series of events, allowing portable extensions to integrate with
 the container initialization process defined in Section 12.2.

 Maybe we should file a new spec issue to clarify that such invocations
 should result in IllegalStateException...

 Martin


 Dne 4.3.2014 17:42, Christian Sadilek napsal(a):
 Hi Jozef,

 I think clearing the cache at the end of the Weld bootstrap process is not 
 enough to solve that particular problem since a CDI extension can hold on to 
 the ABD reference and invoke addObserverMethod later (multiple times) which 
 causes the same problem I described below. There's no indication to the 
 caller of addObserverMethod that it's in fact too late to call that method.

 Since an ABD event reference can always escape (can be used outside the 
 method that observes it) it seems this issue should be resolved (although it 
 admittedly is an edge case).

 Cheers,
 Christian

 On 2014-03-04, at 11:29 AM, Jozef Hartinger jhart...@redhat.com wrote:

 Hi Christian,

 this sounds like a bug. All the resolution caches should be cleared at the 
 very end of Weld's bootstrap sequence (after ABD observers are called). 
 (see 
 https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java#L415)

 Jozef

 On 03/04/2014 04:36 PM, Christian Sadilek wrote:
 Hi everyone,

 CDI extensions can observe the AfterBeanDiscovery event to register 
 observer methods (addObserverMethod). However, when an event is first 
 fired, the observers for that event are resolved and then cached (in 
 TypeSafeResolver). All future calls to addObserverMethod for an already 
 fired event with corresponding qualifiers will have no effect because the 
 observer result is read from cache and not recomputed.

 From an API perspective that's unfortunate because addObserverMethod will 
 only work until an event (with corresponding qualifiers) is fired and 
 there is no indication to the caller of that method that it didn't have 
 any effect when invoked after that.

 Possible solutions:

 - Provide some public API to clear/recompute that part the observer cache. 
 Maybe that exists? I couldn't find it which is why I am using the private 
 API and Reflection :(. Also let AfterBeanDiscovery.addObserverMethod fail 
 in that case with the advice to reset the cache.

 - Recompute the corresponding part of the cache when addObserverMethod is 
 called (seems preferable).

 OpenWebBeans doesn't have this issue as their NotificationManager will 
 simply add the new ObserverMethod to a ConcurrentHashMap that is also 
 accessed when an event is fired.

 What do you think? Can this already be done or is there another solution?

 Cheers,
 Christian







 ___
 weld-dev mailing list
 weld-dev@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/weld-dev

 ___
 weld-dev mailing list
 weld-dev@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/weld-dev


___
weld-dev mailing list
weld-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/weld-dev


Re: [weld-dev] AfterBeanDiscovery and observer resolver cache

2014-03-05 Thread Martin Kouba
FYI I've informed CDI EG and it will be discussed on the next meeting
whether to clarify this already in CDI 1.2 MR...

M

Dne 5.3.2014 10:19, Jozef Hartinger napsal(a):
 Agreed. It is definitely not the intention of the specification to allow 
 beans/observers/contexts to be added at runtime and applications should 
 not have any expectations of what these methods do when invoked outside 
 of the AfterBeanDiscovery observer.
 
 We'll add stricter validation to Weld to disallow this.
 
 On 03/05/2014 08:53 AM, Martin Kouba wrote:
 Hi Christian,this

 actually invoking any container lifecycle event method after the
 container initialization finished should have no effect. ABD event
 reference can escape but it does not mean you can invoke ABD.addBean()
 after ADV is fired.

 The spec wording is not very explicit here:
 During the application initialization process, the container fires a
 series of events, allowing portable extensions to integrate with
 the container initialization process defined in Section 12.2.

 Maybe we should file a new spec issue to clarify that such invocations
 should result in IllegalStateException...

 Martin


 Dne 4.3.2014 17:42, Christian Sadilek napsal(a):
 Hi Jozef,

 I think clearing the cache at the end of the Weld bootstrap process is not 
 enough to solve that particular problem since a CDI extension can hold on 
 to the ABD reference and invoke addObserverMethod later (multiple times) 
 which causes the same problem I described below. There's no indication to 
 the caller of addObserverMethod that it's in fact too late to call that 
 method.

 Since an ABD event reference can always escape (can be used outside the 
 method that observes it) it seems this issue should be resolved (although 
 it admittedly is an edge case).

 Cheers,
 Christian

 On 2014-03-04, at 11:29 AM, Jozef Hartinger jhart...@redhat.com wrote:

 Hi Christian,

 this sounds like a bug. All the resolution caches should be cleared at the 
 very end of Weld's bootstrap sequence (after ABD observers are called). 
 (see 
 https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java#L415)

 Jozef

 On 03/04/2014 04:36 PM, Christian Sadilek wrote:
 Hi everyone,

 CDI extensions can observe the AfterBeanDiscovery event to register 
 observer methods (addObserverMethod). However, when an event is first 
 fired, the observers for that event are resolved and then cached (in 
 TypeSafeResolver). All future calls to addObserverMethod for an already 
 fired event with corresponding qualifiers will have no effect because the 
 observer result is read from cache and not recomputed.

 From an API perspective that's unfortunate because addObserverMethod 
 will only work until an event (with corresponding qualifiers) is fired 
 and there is no indication to the caller of that method that it didn't 
 have any effect when invoked after that.

 Possible solutions:

 - Provide some public API to clear/recompute that part the observer 
 cache. Maybe that exists? I couldn't find it which is why I am using the 
 private API and Reflection :(. Also let 
 AfterBeanDiscovery.addObserverMethod fail in that case with the advice to 
 reset the cache.

 - Recompute the corresponding part of the cache when addObserverMethod is 
 called (seems preferable).

 OpenWebBeans doesn't have this issue as their NotificationManager will 
 simply add the new ObserverMethod to a ConcurrentHashMap that is also 
 accessed when an event is fired.

 What do you think? Can this already be done or is there another solution?

 Cheers,
 Christian







 ___
 weld-dev mailing list
 weld-dev@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/weld-dev

 ___
 weld-dev mailing list
 weld-dev@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/weld-dev

 
___
weld-dev mailing list
weld-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/weld-dev


Re: [weld-dev] AfterBeanDiscovery and observer resolver cache

2014-03-05 Thread Martin Kouba
Hi Christian,

the problem is that CDI is static by design. Anyway feel free to create
a feature request in the spec issue tracker
(https://issues.jboss.org/browse/CDI).

Martin

Dne 5.3.2014 17:01, Christian Sadilek napsal(a):
 Hi,
 
 Yes, I expected this to not be an officially supported use case. So, I guess 
 it's just a matter of improving the API design/documentation.
 
 However, dynamically registering an observer method would really be useful in 
 the case of Errai where we set up an event bridge between the server and the 
 client and potentially discover new observers at runtime.
 
 We could work around this by registering an observer method that observes all 
 events and then handle the dispatching internally but that seems less 
 efficient. Right now this works because OpenWebBeans doesn't cache the 
 observers and allows invocations to AfterBeanDiscovery.addObserverMethod at 
 runtime and because Weld has the functionality to clear the observer cache 
 (although that's not public API).
 
 My questions is: Is there a good reason not to support this going forward? 
 Can we add alternative functionality to add observer methods at runtime (not 
 using ABD)?
 
 Cheers,
 Christian
 
 On 2014-03-05, at 4:37 AM, Martin Kouba mko...@redhat.com wrote:
 
 FYI I've informed CDI EG and it will be discussed on the next meeting
 whether to clarify this already in CDI 1.2 MR...

 M

 Dne 5.3.2014 10:19, Jozef Hartinger napsal(a):
 Agreed. It is definitely not the intention of the specification to allow 
 beans/observers/contexts to be added at runtime and applications should 
 not have any expectations of what these methods do when invoked outside 
 of the AfterBeanDiscovery observer.

 We'll add stricter validation to Weld to disallow this.

 On 03/05/2014 08:53 AM, Martin Kouba wrote:
 Hi Christian,this

 actually invoking any container lifecycle event method after the
 container initialization finished should have no effect. ABD event
 reference can escape but it does not mean you can invoke ABD.addBean()
 after ADV is fired.

 The spec wording is not very explicit here:
 During the application initialization process, the container fires a
 series of events, allowing portable extensions to integrate with
 the container initialization process defined in Section 12.2.

 Maybe we should file a new spec issue to clarify that such invocations
 should result in IllegalStateException...

 Martin


 Dne 4.3.2014 17:42, Christian Sadilek napsal(a):
 Hi Jozef,

 I think clearing the cache at the end of the Weld bootstrap process is 
 not enough to solve that particular problem since a CDI extension can 
 hold on to the ABD reference and invoke addObserverMethod later (multiple 
 times) which causes the same problem I described below. There's no 
 indication to the caller of addObserverMethod that it's in fact too late 
 to call that method.

 Since an ABD event reference can always escape (can be used outside the 
 method that observes it) it seems this issue should be resolved (although 
 it admittedly is an edge case).

 Cheers,
 Christian

 On 2014-03-04, at 11:29 AM, Jozef Hartinger jhart...@redhat.com wrote:

 Hi Christian,

 this sounds like a bug. All the resolution caches should be cleared at 
 the very end of Weld's bootstrap sequence (after ABD observers are 
 called). (see 
 https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java#L415)

 Jozef

 On 03/04/2014 04:36 PM, Christian Sadilek wrote:
 Hi everyone,

 CDI extensions can observe the AfterBeanDiscovery event to register 
 observer methods (addObserverMethod). However, when an event is first 
 fired, the observers for that event are resolved and then cached (in 
 TypeSafeResolver). All future calls to addObserverMethod for an already 
 fired event with corresponding qualifiers will have no effect because 
 the observer result is read from cache and not recomputed.

 From an API perspective that's unfortunate because addObserverMethod 
 will only work until an event (with corresponding qualifiers) is fired 
 and there is no indication to the caller of that method that it didn't 
 have any effect when invoked after that.

 Possible solutions:

 - Provide some public API to clear/recompute that part the observer 
 cache. Maybe that exists? I couldn't find it which is why I am using 
 the private API and Reflection :(. Also let 
 AfterBeanDiscovery.addObserverMethod fail in that case with the advice 
 to reset the cache.

 - Recompute the corresponding part of the cache when addObserverMethod 
 is called (seems preferable).

 OpenWebBeans doesn't have this issue as their NotificationManager will 
 simply add the new ObserverMethod to a ConcurrentHashMap that is also 
 accessed when an event is fired.

 What do you think? Can this already be done or is there another 
 solution?

 Cheers,
 Christian







 ___
 weld-dev mailing list
 weld-dev@lists.jboss.org
 

Re: [weld-dev] AfterBeanDiscovery and observer resolver cache

2014-03-04 Thread Jozef Hartinger
Hi Christian,

this sounds like a bug. All the resolution caches should be cleared at 
the very end of Weld's bootstrap sequence (after ABD observers are 
called). (see 
https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java#L415)

Jozef

On 03/04/2014 04:36 PM, Christian Sadilek wrote:
 Hi everyone,

 CDI extensions can observe the AfterBeanDiscovery event to register observer 
 methods (addObserverMethod). However, when an event is first fired, the 
 observers for that event are resolved and then cached (in TypeSafeResolver). 
 All future calls to addObserverMethod for an already fired event with 
 corresponding qualifiers will have no effect because the observer result is 
 read from cache and not recomputed.

 From an API perspective that's unfortunate because addObserverMethod will 
 only work until an event (with corresponding qualifiers) is fired and there 
 is no indication to the caller of that method that it didn't have any effect 
 when invoked after that.

 Possible solutions:

 - Provide some public API to clear/recompute that part the observer cache. 
 Maybe that exists? I couldn't find it which is why I am using the private API 
 and Reflection :(. Also let AfterBeanDiscovery.addObserverMethod fail in that 
 case with the advice to reset the cache.

 - Recompute the corresponding part of the cache when addObserverMethod is 
 called (seems preferable).

 OpenWebBeans doesn't have this issue as their NotificationManager will simply 
 add the new ObserverMethod to a ConcurrentHashMap that is also accessed when 
 an event is fired.

 What do you think? Can this already be done or is there another solution?

 Cheers,
 Christian







 ___
 weld-dev mailing list
 weld-dev@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/weld-dev

___
weld-dev mailing list
weld-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/weld-dev


Re: [weld-dev] AfterBeanDiscovery and observer resolver cache

2014-03-04 Thread Martin Kouba
Hi Christian,

actually invoking any container lifecycle event method after the
container initialization finished should have no effect. ABD event
reference can escape but it does not mean you can invoke ABD.addBean()
after ADV is fired.

The spec wording is not very explicit here:
During the application initialization process, the container fires a
series of events, allowing portable extensions to integrate with
the container initialization process defined in Section 12.2.

Maybe we should file a new spec issue to clarify that such invocations
should result in IllegalStateException...

Martin


Dne 4.3.2014 17:42, Christian Sadilek napsal(a):
 Hi Jozef,
 
 I think clearing the cache at the end of the Weld bootstrap process is not 
 enough to solve that particular problem since a CDI extension can hold on to 
 the ABD reference and invoke addObserverMethod later (multiple times) which 
 causes the same problem I described below. There's no indication to the 
 caller of addObserverMethod that it's in fact too late to call that method.
 
 Since an ABD event reference can always escape (can be used outside the 
 method that observes it) it seems this issue should be resolved (although it 
 admittedly is an edge case).
 
 Cheers,
 Christian
 
 On 2014-03-04, at 11:29 AM, Jozef Hartinger jhart...@redhat.com wrote:
 
 Hi Christian,

 this sounds like a bug. All the resolution caches should be cleared at the 
 very end of Weld's bootstrap sequence (after ABD observers are called). (see 
 https://github.com/weld/core/blob/master/impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java#L415)

 Jozef

 On 03/04/2014 04:36 PM, Christian Sadilek wrote:
 Hi everyone,

 CDI extensions can observe the AfterBeanDiscovery event to register 
 observer methods (addObserverMethod). However, when an event is first 
 fired, the observers for that event are resolved and then cached (in 
 TypeSafeResolver). All future calls to addObserverMethod for an already 
 fired event with corresponding qualifiers will have no effect because the 
 observer result is read from cache and not recomputed.

 From an API perspective that's unfortunate because addObserverMethod will 
 only work until an event (with corresponding qualifiers) is fired and 
 there is no indication to the caller of that method that it didn't have 
 any effect when invoked after that.

 Possible solutions:

 - Provide some public API to clear/recompute that part the observer cache. 
 Maybe that exists? I couldn't find it which is why I am using the private 
 API and Reflection :(. Also let AfterBeanDiscovery.addObserverMethod fail 
 in that case with the advice to reset the cache.

 - Recompute the corresponding part of the cache when addObserverMethod is 
 called (seems preferable).

 OpenWebBeans doesn't have this issue as their NotificationManager will 
 simply add the new ObserverMethod to a ConcurrentHashMap that is also 
 accessed when an event is fired.

 What do you think? Can this already be done or is there another solution?

 Cheers,
 Christian







 ___
 weld-dev mailing list
 weld-dev@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/weld-dev

 
 
 ___
 weld-dev mailing list
 weld-dev@lists.jboss.org
 https://lists.jboss.org/mailman/listinfo/weld-dev
 
___
weld-dev mailing list
weld-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/weld-dev