You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by jl...@apache.org on 2007/02/14 03:07:16 UTC

svn commit: r507355 - in /incubator/cxf/trunk/rt: bindings/soap/src/main/java/org/apache/cxf/binding/soap/ bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ core/src/main/java/org/apache/cxf/interceptor/ frontend/jaxws/src/main/java/...

Author: jliu
Date: Tue Feb 13 18:07:15 2007
New Revision: 507355

URL: http://svn.apache.org/viewvc?view=rev&rev=507355
Log:
CXF-249. Replace XMLStreamWriter with DOMStreamWriter when JAX-WS Soap handlers are registered with the chain. The idea is to create a SAAJ DOM model up front if we know that we are going to need a SAAJ tree in a later stage anyway, then let interceptors use a DOMXMLStreamWriter to write content into this SAAJ DOM model directly. This can avoid the unnecessary parsing time from Stax output stream to SAAJ model. 

Modified:
    incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
    incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java
    incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java
    incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java

Modified: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java?view=diff&rev=507355&r1=507354&r2=507355
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java (original)
+++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java Tue Feb 13 18:07:15 2007
@@ -54,6 +54,8 @@
 import org.apache.cxf.interceptor.AttachmentOutInterceptor;
 import org.apache.cxf.interceptor.BareOutInterceptor;
 import org.apache.cxf.interceptor.DocLiteralInInterceptor;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
 import org.apache.cxf.interceptor.StaxInInterceptor;
 import org.apache.cxf.interceptor.StaxOutInterceptor;
 import org.apache.cxf.interceptor.URIMappingInterceptor;
@@ -122,12 +124,16 @@
         sb.getInInterceptors().add(new StaxInInterceptor());        
         sb.getInInterceptors().add(new SoapHeaderInterceptor());
         
+        sb.getInInterceptors().add(new LoggingInInterceptor());
+      
         sb.getOutInterceptors().add(new SoapActionInterceptor());
         sb.getOutInterceptors().add(new AttachmentOutInterceptor());
         
         sb.getOutInterceptors().add(new StaxOutInterceptor());
         sb.getOutInterceptors().add(new SoapPreProtocolOutInterceptor());
         sb.getOutInterceptors().add(new SoapOutInterceptor());
+
+        sb.getOutInterceptors().add(new LoggingOutInterceptor());
 
         sb.getOutFaultInterceptors().add(new StaxOutInterceptor());
         sb.getOutFaultInterceptors().add(new SoapOutInterceptor());

Modified: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java?view=diff&rev=507355&r1=507354&r2=507355
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java (original)
+++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/SoapOutInterceptor.java Tue Feb 13 18:07:15 2007
@@ -59,7 +59,6 @@
         SoapVersion soapVersion = message.getVersion();
         try {            
             XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
-            message.setContent(XMLStreamWriter.class, xtw);            
             xtw.setPrefix(soapVersion.getPrefix(), soapVersion.getNamespace());
             xtw.writeStartElement(soapVersion.getPrefix(), 
                                   soapVersion.getEnvelope().getLocalPart(),

Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java?view=diff&rev=507355&r1=507354&r2=507355
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java Tue Feb 13 18:07:15 2007
@@ -79,8 +79,9 @@
         boolean result = message.getInterceptorChain().doIntercept(message);
         
         try {
-            if (writer != null) {
-                writer.close();
+            XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
+            if (xtw != null) {
+                xtw.close();
             }
             
             if (!result && message.getContent(Exception.class) != null) {

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java?view=diff&rev=507355&r1=507354&r2=507355
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java Tue Feb 13 18:07:15 2007
@@ -27,6 +27,7 @@
 import java.util.Set;
 
 import javax.xml.namespace.QName;
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.soap.SOAPBody;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPMessage;
@@ -34,6 +35,7 @@
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
 import javax.xml.ws.Binding;
 import javax.xml.ws.handler.Handler;
 import javax.xml.ws.handler.MessageContext;
@@ -51,6 +53,7 @@
 import org.apache.cxf.jaxws.handler.AbstractProtocolHandlerInterceptor;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.Phase;
+import org.apache.cxf.staxutils.W3CDOMStreamWriter;
 
 public class SOAPHandlerInterceptor extends
         AbstractProtocolHandlerInterceptor<SoapMessage> implements
@@ -62,7 +65,7 @@
     public SOAPHandlerInterceptor(Binding binding) {
         super(binding);
         setPhase(Phase.PRE_PROTOCOL);
-        addBefore((new StaxOutInterceptor()).getId());
+        addAfter((new StaxOutInterceptor()).getId());
     }
 
     public Set<URI> getRoles() {
@@ -91,10 +94,16 @@
             return;
         }
         if (getInvoker(message).isOutbound()) {
-            OutputStream os = message.getContent(OutputStream.class);
-            CachedStream cs = new CachedStream();
-            message.setContent(OutputStream.class, cs);
-
+            try {
+                // Replace stax writer with DomStreamWriter
+                W3CDOMStreamWriter writer = new W3CDOMStreamWriter();
+                message.setContent(XMLStreamWriter.class, writer);
+            } catch (ParserConfigurationException e) {
+                throw new SoapFault(new org.apache.cxf.common.i18n.Message(
+                    "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), e,
+                    message.getVersion().getSender());
+            }
+            
             message.getInterceptorChain().doInterceptInSubChain(message);
 
             super.handleMessage(message);
@@ -102,19 +111,13 @@
             try {
                 // Stream SOAPMessage back to output stream if necessary
                 SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
+
                 if (soapMessage != null) {
+                    OutputStream os = message.getContent(OutputStream.class);
                     soapMessage.writeTo(os);
-                } else {
-                    cs.flush();
-                    AbstractCachedOutputStream csnew = (AbstractCachedOutputStream) message
-                            .getContent(OutputStream.class);
-                    AbstractCachedOutputStream.copyStream(csnew
-                            .getInputStream(), os, 64 * 1024);
-                    cs.close();
-                }
-
-                os.flush();
-                message.setContent(OutputStream.class, os);
+                    os.flush();
+                } 
+                
             } catch (IOException ioe) {
                 throw new SoapFault(new org.apache.cxf.common.i18n.Message(
                         "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), ioe,

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java?view=diff&rev=507355&r1=507354&r2=507355
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java Tue Feb 13 18:07:15 2007
@@ -21,8 +21,6 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
-//import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.ResourceBundle;
@@ -34,26 +32,33 @@
 import javax.xml.soap.MessageFactory;
 import javax.xml.soap.MimeHeaders;
 import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPMessage;
+import javax.xml.soap.SOAPPart;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.dom.DOMSource;
 import javax.xml.ws.handler.MessageContext;
 import javax.xml.ws.handler.soap.SOAPMessageContext;
 
+import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+
 import org.apache.cxf.binding.soap.Soap11;
 import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.SoapVersion;
 import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.helpers.XMLUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.io.AbstractCachedOutputStream;
 import org.apache.cxf.jaxws.context.WrappedMessageContext;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.XMLMessage;
 import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.cxf.staxutils.W3CDOMStreamWriter;
 
 public class SOAPMessageContextImpl extends WrappedMessageContext implements SOAPMessageContext {
     private static final ResourceBundle BUNDLE = BundleUtils.getBundle(SOAPMessageContextImpl.class);
@@ -74,14 +79,31 @@
                 Boolean outboundProperty = (Boolean)get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
 
                 if (outboundProperty) {
-                    MessageFactory factory = MessageFactory.newInstance();
-                    MimeHeaders mhs = null;
-                    //Safe to do this cast as SOAPHandlerInterceptor has explictly 
-                    //replaced OutputStream with AbstractCachedOutputStream.
-                    AbstractCachedOutputStream out = (AbstractCachedOutputStream)getWrappedMessage()
-                        .getContent(OutputStream.class);
-                    InputStream is = out.getInputStream();
-                    message = factory.createMessage(mhs, is);
+                    SoapVersion soapVersion = ((SoapMessage)getWrappedMessage()).getVersion();
+                    
+                    if (soapVersion == null) {
+                        soapVersion = Soap11.getInstance();
+                    }
+                    soapVersion = ((SoapMessage)getWrappedMessage()).getVersion();
+                 
+                    XMLStreamWriter xtw = getWrappedMessage().getContent(XMLStreamWriter.class);
+                    Document doc = ((W3CDOMStreamWriter)xtw).getDocument();
+                    
+                    XMLUtils.printDOM(doc);
+               
+                    MessageFactory factory = null;
+                    if (soapVersion.getVersion() == 1.1) {
+                        factory = MessageFactory.newInstance();
+                    } else {
+                        factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+                    }
+                    message = factory.createMessage();
+
+                    SOAPPart soapPart = message.getSOAPPart();
+                    DOMSource preppedMsgSrc = new DOMSource(doc.getDocumentElement());
+                    soapPart.setContent(preppedMsgSrc);
+                    message.saveChanges();
+
                 } else {
                     
                     if (getWrappedMessage().getContent(Object.class) != null) {

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java?view=diff&rev=507355&r1=507354&r2=507355
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java Tue Feb 13 18:07:15 2007
@@ -40,6 +40,7 @@
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
 import javax.xml.ws.Binding;
 import javax.xml.ws.handler.Handler;
 import javax.xml.ws.handler.MessageContext;
@@ -82,71 +83,7 @@
     public void tearDown() {
     }
 
-    // SAAJ tree is created on demand. SAAJ wont be created without
-    // the calling of SOAPMessageContext.getMessage().
-    public void testNoCallToGetMessageOutBound() throws Exception {
-        List<Handler> list = new ArrayList<Handler>();
-        list.add(new SOAPHandler<SOAPMessageContext>() {
-            public boolean handleMessage(SOAPMessageContext smc) {
-                return true;
-            }
-
-            public boolean handleFault(SOAPMessageContext smc) {
-                return true;
-            }
-
-            public Set<QName> getHeaders() {
-                return null;
-            }
-
-            public void close(MessageContext messageContext) {
-            }
-        });
-        HandlerChainInvoker invoker = new HandlerChainInvoker(list);
-
-        IMocksControl control = createNiceControl();
-        Binding binding = control.createMock(Binding.class);
-        Exchange exchange = control.createMock(Exchange.class);
-        expect(exchange.get(HandlerChainInvoker.class)).andReturn(invoker).anyTimes();
-        SoapMessage message = new SoapMessage(new MessageImpl());
-        message.setExchange(exchange);        
-        // This is to set direction to outbound
-        expect(exchange.getOutMessage()).andReturn(message).anyTimes();
-        CachedStream originalEmptyOs = new CachedStream();
-        message.setContent(OutputStream.class, originalEmptyOs);
-
-        InterceptorChain chain = new PhaseInterceptorChain((new PhaseManagerImpl()).getOutPhases());
-        // This is to simulate interceptors followed by SOAPHandlerInterceptor
-        // write outputStream
-        chain.add(new AbstractProtocolHandlerInterceptor<SoapMessage>(binding) {
-            public void handleMessage(SoapMessage message) throws Fault {
-                try {
-                    CachedStream os = prepareOutputStreamFromResource("resources/greetMeRpcLitResp.xml");
-                    message.setContent(OutputStream.class, os);
-                } catch (Exception e) {
-                    // do nothing
-                }
-            }
-
-        });
-        message.setInterceptorChain(chain);
-        control.replay();
-
-        SOAPHandlerInterceptor li = new SOAPHandlerInterceptor(binding);
-        li.handleMessage(message);
-        control.verify();
-
-        // Verify outputStream
-        CachedStream expectedOs = prepareOutputStreamFromResource("resources/greetMeRpcLitResp.xml");
-        assertTrue("The content of outputStream should remain unchanged", compareInputStream(expectedOs
-            .getInputStream(), originalEmptyOs.getInputStream()));
-        // Verify SOAPMessage
-        SOAPMessage resultedMessage = message.getContent(SOAPMessage.class);
-        assertNull(resultedMessage);
-    }
-
-    // SAAJ tree is created on if SOAPMessageContext.getMessage() is
-    // called. Any changes to SOAPMessage should be streamed back to
+    // SAAJ tree is created from DOMXMLStreamWriter. Any changes to SOAPMessage should be streamed back to
     // outputStream
     public void testChangeSOAPBodyOutBound() throws Exception {
         List<Handler> list = new ArrayList<Handler>();
@@ -190,14 +127,20 @@
         message.setContent(OutputStream.class, originalEmptyOs);
 
         InterceptorChain chain = new PhaseInterceptorChain((new PhaseManagerImpl()).getOutPhases());
-        // This is to simulate interceptors followed by SOAPHandlerInterceptor
-        // write outputStream
+        //Interceptors after SOAPHandlerInterceptor DOMXMLStreamWriter to write
         chain.add(new AbstractProtocolHandlerInterceptor<SoapMessage>(binding) {
             public void handleMessage(SoapMessage message) throws Fault {
                 try {
-                    CachedStream os = prepareOutputStreamFromResource(
-                        "resources/greetMeRpcLitRespChanged.xml");
-                    message.setContent(OutputStream.class, os);
+                    XMLStreamWriter writer = message.getContent(XMLStreamWriter.class); 
+                    SoapVersion soapVersion = Soap11.getInstance();
+                    writer.setPrefix(soapVersion.getPrefix(), soapVersion.getNamespace());
+                    writer.writeStartElement(soapVersion.getPrefix(), 
+                                          soapVersion.getEnvelope().getLocalPart(),
+                                          soapVersion.getNamespace());
+                    writer.writeNamespace(soapVersion.getPrefix(), soapVersion.getNamespace());
+                    writer.writeEndElement();
+                    
+                    writer.flush();
                 } catch (Exception e) {
                     // do nothing
                 }
@@ -360,14 +303,24 @@
         message.setContent(OutputStream.class, originalEmptyOs);
 
         InterceptorChain chain = new PhaseInterceptorChain((new PhaseManagerImpl()).getOutPhases());
-        // This is to simulate interceptors followed by SOAPHandlerInterceptor
-        // write outputStream
+        //Interceptors after SOAPHandlerInterceptor DOMXMLStreamWriter to write
         chain.add(new AbstractProtocolHandlerInterceptor<SoapMessage>(binding) {
             public void handleMessage(SoapMessage message) throws Fault {
                 try {
-                    CachedStream os = prepareOutputStreamFromResource(
-                        "resources/greetMeRpcLitRespWithHeader.xml");
-                    message.setContent(OutputStream.class, os);
+                    XMLStreamWriter writer = message.getContent(XMLStreamWriter.class); 
+                    SoapVersion soapVersion = Soap11.getInstance();
+                    writer.setPrefix(soapVersion.getPrefix(), soapVersion.getNamespace());
+                    writer.writeStartElement(soapVersion.getPrefix(), 
+                                          soapVersion.getEnvelope().getLocalPart(),
+                                          soapVersion.getNamespace());
+                    writer.writeNamespace(soapVersion.getPrefix(), soapVersion.getNamespace());
+                    
+                    Element headerElement = preparemSOAPHeader();
+                    StaxUtils.writeElement(headerElement, writer, true, false);
+                    
+                    writer.writeEndElement();
+                    
+                    writer.flush();
                 } catch (Exception e) {
                     // do nothing
                 }