Hi Christian! It is better we move this one over to the openwebbeans-dev list.
LieGrue, strub ----- Original Message ----- > From: Christian Beikov <c.bei...@curecomp.com> > To: MyFaces Discussion <users@myfaces.apache.org> > Cc: > Sent: Monday, April 2, 2012 6:46 PM > Subject: OWB Decorators > > Hello there! > > I have just found out something that really scared me! > I am using for this example 2 Decorators for one Interface and a simple > implementation, like this: > > interface Service extends Serializable{ > public Object getSomething(int value); > public boolean test(String text); > } > > ----------------- > public class MyService implements Service { > > /* Used somewhere else to be able to use decorators and interceptors */ > @Inject > private Service delegate; > > public boolean test(String text){ > return false; > } > } > > ----------------- > @Decorator > public abstract class ServiceDecoratorA implements Service { > @Delegate > @Inject > private Service delegate; > > public boolean test(String text){ > Object o = delegate.getSomething(); > > if(/*condition*/){ > return true; > } else { > return delegate.test(text); > } > } > } > > ---------------- > @Decorator > public abstract class ServiceDecoratorB implements Service { > @Delegate > @Inject > private Service delegate; > > public boolean test(String text){ > Object o = delegate.getSomething(); > > if(/*condition*/){ > return true; > } else { > return delegate.test(text); > } > } > } > > Invocation(Through EL): #{myService.test('aString')} > Expected Invocation-Chain: > OWB-Proxy.test(String)->...->ServiceDecoratorA.test(String)->ServiceDecoratorB.test(String)->MyService.test(String) > Actual Invocation-Chain: > OWB-Proxy.test(String)->...->ServiceDecoratorA.test(String)->MyService.test(String) > > When I call the method test(String) decorator A is accessed when the > condition > evaluates to false I would expect the next decorator to be called, instead > MyService.test(String) is called. If I put the expression > delegate.test(String) > to the first line in the decorator method, temporary put the result in a > local > var and return the local vars content, everything works as expected. > > I think that the invocation of the delegate mixes up a state of the OWB proxy > or > so. I have no idea about what happens here but it sucks and I think that this > behavior is wrong. > I fixed this problem right now with temporary saving the delegates return > into a > local var and the do other invocations on the delegate. > > Is this a bug or is it not allowed to call other methods than the decorated > one > in the decorator method? > > Regards, > > Christian >