Here you go. It looks like below (roughly):

import java.io.IOException;
import java.io.OutputStream;

import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.phase.Phase;


public class XSLTOutInterceptor extends AbstractSoapInterceptor {
    private OutputStream originalOs;

    public XSLTOutInterceptor() {
        super(Phase.PRE_PROTOCOL);
    }
    
    public void handleMessage(SoapMessage message) throws Fault {
        boolean isOutbound = false;
        isOutbound = message == message.getExchange().getOutMessage()
               || message == message.getExchange().getOutFaultMessage();

        if (isOutbound) {
            //replace the original output stream with our own outputstream,
            //so that the output can be cached for xslt transformation, 
otherwise
            //the output might be flushed to socket before xslt.
            originalOs = message.getContent(OutputStream.class);
            CachedOutputStream cos = new CachedOutputStream();
            message.setContent(OutputStream.class, cos);

            // Add an ending interceptor to read the cached output and do xslt
            message.getInterceptorChain().add(new XSLTOutEndingInterceptor());
        }
    }
    
    public class XSLTOutEndingInterceptor extends AbstractSoapInterceptor {
        public XSLTOutEndingInterceptor() {
            super(Phase.PRE_PROTOCOL_ENDING);
        }

        public void handleMessage(SoapMessage message) throws Fault {
            try {
                CachedOutputStream cos = 
(CachedOutputStream)message.getContent(OutputStream.class);
                //the output is cached in CachedOutputStream, now lets do xslt. 
               
                Transformer trans =m ...      

                // write the transformed result back to the original output 
stream         
                trans.transform(new StreamSource(cos.getInputStream()), new 
StreamResult(originalOs));
                
                //set the original output stream back
                message.setContent(OutputStream.class, originalOs);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
}
> -----Original Message-----
> From: mule1 [mailto:[EMAIL PROTECTED]
> Sent: 2007年11月26日 22:29
> To: cxf-user@incubator.apache.org
> Subject: RE: what would be the best place to introduce xslt transformer for
> response message
> 
> 
> Hello,
> 
> I am not clear exactly what you said. I looked at the SAAJOutInterceptor,
> but didn't clearly understand how I can get the message content - either
> bytes or something that I can use to tranform with an xslt transfomer. If
> possible, can you provide me some sample lines of code? Thanks.
> --
> View this message in context:
> http://www.nabble.com/what-would-be-the-best-place-to-introduce-xslt-tr
> ansformer-for-response-message-tf4862565.html#a13950419
> Sent from the cxf-user mailing list archive at Nabble.com.

----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

Reply via email to