Re: OWB Decorators

2012-04-02 Thread Mark Struberg
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 us...@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



Re: OWB Decorators

2012-04-02 Thread Eric Covener
 Is this a bug or is it not allowed to call other methods than the decorated 
 one
 in the decorator method?

I think the behavior he expects is the correct behavior, having not
looked at the code, as the stack unwinds we need to back up the
decorator we're looking at as next.