Well, stopping the current "out" chain is easy.   You pretty much just need to 
grab the chain from the message and "pause" it.   

The custom response part is the tricky part and depends on how you want to go 
about it.

Easy way, kind of "hacky", but fast as no additional processing will/can 
occur:
Create a new MessageImpl and set the exchange.setInMessage() to it.
do exchange.put("exchange.finished", Boolean.TRUE);
set inMsg.setContent(List.class, .....)  to a List which would represent the 
return valued.  It should just be a list of length 1.


Harder, but more "complete/correct" as it will call the incoming chain so 
things like Holders and wrappers and stuff can be used:
You basically need to get the Conduit out of the out message:

 Exchange exchange = message.getExchange();
 Conduit conduit = exchange.getConduit(message);

The conduit MOST LIKELY (all of ours except the CorbaConduit do) extend from 
AbstractConduit (not sure why the Corba one doesn't) which extends 
AbstractObservable which has a method: MessageObserver getMessageObserver()

Basically, you would create a new Message, fill in the details such as the 
List as above, maybe an InputStream if your response is a stream, fake 
headers, etc.... and call the handleMessage call on that MessageObserver.    

That will setup a complete interceptor chain and such for the "incoming" 
message.   If you need it to skip things (like not do the stream things), you 
can set
message.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID, ...)
or 
message.put(PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID, ...)

to have it start at a specific point.


Hope that helps a bit!
Dan




On Wed September 30 2009 2:15:57 am inalasuresh wrote:
> Hi One & All
> 
> While we are working on Delegate (for cxfbc:provider) for FUSE, we have
>  some technical issues and need some assistance.
> 
> Problem Description
> 
> In OUT interceptor of a CXF provider, how can we stop the provider invoking
> its endpoint and send a response back?
> 
> Example:
> I have a cxfbc:provider with some interceptors configured for both IN and
> OUT flows. When the cxf provider is making a request, the OUT interceptor
> gets invoked and in this interceptor I would like to stop invoking actual
> endpoint and send back my own response. That means I should be able to tell
> the interceptor chain to stop further processing of this flow, set a
> response message into message exchange and invoke the IN flow. How do I do
> that?
> 
> This kind of mediation/interception is possible in standard specifications
> like JAX-RPC, JAX-WS, Servlets etc… wondering if CXF provides any sort of
> this kind.
> 
> Also we would like to know who is invoking a provider endpoint in CXF stack
> in FUSE? Is it an OUT interceptor at the end of interceptor chain or some
> other transport component after the interceptor chain?
> 
> Thanks in Advance
>     Suresh
> 

-- 
Daniel Kulp
[email protected]
http://www.dankulp.com/blog

Reply via email to