cxf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dan Diephouse <...@envoisolutions.com>
Subject Re: Interceptor Ordering
Date Sat, 04 Nov 2006 18:43:32 GMT
Liu, Jervis wrote:

>>-----Original Message-----
>>From: Dan Diephouse [mailto:dan@envoisolutions.com]
>>Sent: 2006?11?2? 1:29
>>To: cxf-dev@incubator.apache.org
>>Subject: Re: Interceptor Ordering
>>
>>
>>Hiya Jervis,
>>
>>Liu, Jervis wrote:
>>    
>>
>>>The getBefore()/getAfter does not work very well for the 
>>>      
>>>
>>same phase in my experience. Besides the problem you 
>>encountered, I also ran into a similar problem when I was 
>>doing the saaj handlers stuff.  See code snippet below:
>>    
>>
>>>   public SOAPHandlerInterceptor(Binding binding) {
>>>        super(binding);
>>>        setPhase(Phase.PRE_PROTOCOL);
>>>        addBefore((new StaxOutInterceptor()).getId());
>>>    }
>>>
>>>Sometimes using (new StaxOutInterceptor()).getId() is not 
>>>      
>>>
>>possible as the interceptor referred to might be in a module 
>>invisible to SOAPHandlerInterceptor. This can happen when for 
>>example, both interceptors from soap module and jax-ws module 
>>need to be placed in PRE_PROTOCOL phase. In this case we have 
>>to explicitly use a string 
>>"org.apache.cxf.interceptor.StaxOutInterceptor". IMO, the 
>>interceptor should not be aware of any other interceptors in 
>>the chain at all.
>>    
>>
>>>  
>>>      
>>>
>>The ID is just the class name by default. So you could do 
>>StaxOutInterceptor.class.getName() or you could do 
>>"org.apachecxf.interceptors.StaxOutInterceptor".
>>
>>    
>>
>
>Our interceptor chain works very well for ordering interceptors from different phases,
the complexity we try to resolve here is how to writer interceptors belong to same phase and
somehow they can still be dropped into the chain in the expected order. Actually I am also
not convinced that using sth like  IN_PHASE_ID  is an idea good enough, but IMO using a string
representation of "org.apachecxf.interceptors.StaxOutInterceptor" is even worse. This is subjected
to spelling errors and more importantly, why should the interceptor itself be aware of other
interceptors? 
>  
>
Well first, the ID can be anything. It just defaults to the class name - 
so you could set the id to just "stax-out". Second, 99.9% of the time 
you can just do addBefore(StaxOutInterceptor.class.getName()), and then 
you don't have to worry about spelling issues.

>In this case, using an IN_PHASE_ID can work like below:
>
>    public SOAPHandlerInterceptor(Binding binding) {
>        super(binding);
>        setPhase(Phase.PRE_PROTOCOL);
>        setInPhaseID(500);
>    }
>
>    public StaxOutInterceptor() {
>        super();
>        setPhase(Phase.PRE_PROTOCOL);
>        setInPhaseID(700);
>    }
>
>Then its InterceptorChain's responsibility to sort SOAPHandlerInterceptor and StaxOutInterceptor
in order for the same phase.
>
>
>  
>
I don't like how this loses the ability to say "interceptor X depends on 
interceptor Y" and moves things to some arbitrary number. Think of it 
like the maven dependency mechanism. Even if its an optional dependency, 
I still need to declare it and it doesn't hurt to have the optional 
dependency in there. Also, what happens when you need to reorganize the 
interceptors or add some in between? It is a bit more fragile when using #s.

- Dan

-- 
Dan Diephouse
(616) 971-2053
Envoi Solutions LLC
http://netzooid.com


Mime
View raw message