You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ff...@apache.org on 2009/09/08 11:30:30 UTC

svn commit: r812411 - in /servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src: main/java/org/apache/servicemix/cxfbc/ main/java/org/apache/servicemix/cxfbc/interceptors/ test/java/org/apache/servicemix/cxfbc/ tes...

Author: ffang
Date: Tue Sep  8 09:30:29 2009
New Revision: 812411

URL: http://svn.apache.org/viewvc?rev=812411&view=rev
Log:
[SMXCOMP-632]cxf bc consumer should support the case that there's soap header in the out Message

Added:
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/ExtractHeaderPartIntercepor.java
Modified:
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/ws/rm/CxfBcRMBasicTest.java
    servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/resources/HelloWorld-DOC.wsdl

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java?rev=812411&r1=812410&r2=812411&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/CxfBcConsumer.java Tue Sep  8 09:30:29 2009
@@ -101,6 +101,7 @@
 import org.apache.cxf.wsdl.WSDLManager;
 import org.apache.cxf.wsdl11.WSDLServiceFactory;
 import org.apache.servicemix.common.endpoints.ConsumerEndpoint;
+import org.apache.servicemix.cxfbc.interceptors.ExtractHeaderPartIntercepor;
 import org.apache.servicemix.cxfbc.interceptors.JbiInInterceptor;
 import org.apache.servicemix.cxfbc.interceptors.JbiInWsdl1Interceptor;
 import org.apache.servicemix.cxfbc.interceptors.JbiJAASInterceptor;
@@ -462,10 +463,11 @@
             cxfService.getInInterceptors().add(new JbiPostInvokerInterceptor());
 
             cxfService.getInInterceptors().add(new OutgoingChainInterceptor());
-
+         
             cxfService.getOutInterceptors().add(
                     new JbiOutWsdl1Interceptor(isUseJBIWrapper(), isUseSOAPEnvelope()));
-
+            cxfService.getOutInterceptors().add(
+                    new ExtractHeaderPartIntercepor());
             cxfService.getOutInterceptors().add(new SoapActionOutInterceptor());
             cxfService.getOutInterceptors().add(new AttachmentOutInterceptor());
             cxfService.getOutInterceptors().add(

Added: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/ExtractHeaderPartIntercepor.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/ExtractHeaderPartIntercepor.java?rev=812411&view=auto
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/ExtractHeaderPartIntercepor.java (added)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/main/java/org/apache/servicemix/cxfbc/interceptors/ExtractHeaderPartIntercepor.java Tue Sep  8 09:30:29 2009
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.cxfbc.interceptors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.model.SoapBindingInfo;
+import org.apache.cxf.binding.soap.model.SoapHeaderInfo;
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.headers.Header;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.service.model.BindingMessageInfo;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.soap.interceptors.jbi.JbiConstants;
+import org.apache.servicemix.soap.util.DomUtil;
+import org.apache.servicemix.soap.util.QNameUtil;
+
+
+public class ExtractHeaderPartIntercepor extends AbstractPhaseInterceptor<Message> {
+
+    public ExtractHeaderPartIntercepor() {
+        super(Phase.PRE_STREAM);
+    }
+
+    public void handleMessage(Message message) {
+        
+        extractHeaderFromMessagePart(message);
+    }
+
+    private void extractHeaderFromMessagePart(Message message) {
+        Source source = message.getContent(Source.class);
+        if (source == null) {
+            return;
+        }
+
+        Element element;
+        try {
+            element = new SourceTransformer().toDOMElement(source);
+        } catch (Exception e) {
+            throw new Fault(e);
+        }
+
+        if (!JbiConstants.WSDL11_WRAPPER_NAMESPACE.equals(element
+                .getNamespaceURI())
+                || !JbiConstants.WSDL11_WRAPPER_MESSAGE_LOCALNAME
+                        .equals(element.getLocalName())) {
+            message.setContent(Source.class, new DOMSource(element));
+            return;
+        }
+
+        BindingOperationInfo bop = message.getExchange().get(
+                BindingOperationInfo.class);
+        if (bop == null) {
+            throw new Fault(
+                    new Exception("Operation not bound on this message"));
+        }
+        BindingMessageInfo msg = isRequestor(message) ? bop.getInput() : bop
+                .getOutput();
+
+        SoapBindingInfo binding = (SoapBindingInfo) message.getExchange().get(
+                Endpoint.class).getEndpointInfo().getBinding();
+        String style = binding.getStyle(bop.getOperationInfo());
+        if (style == null) {
+            style = binding.getStyle();
+        }
+
+        Element partWrapper = DomUtil.getFirstChildElement(element);
+        while (partWrapper != null) {
+            extractHeaderParts((SoapMessage) message, element, partWrapper, msg);
+            partWrapper = DomUtil.getNextSiblingElement(partWrapper);
+        }
+        message.setContent(Source.class, new DOMSource(element));
+    }
+
+    private void extractHeaderParts(SoapMessage message,
+            Element element, Element partWrapper, BindingMessageInfo msg) {
+        List<NodeList> partsContent = new ArrayList<NodeList>();
+        if (partWrapper != null) {
+            if (!JbiConstants.WSDL11_WRAPPER_NAMESPACE.equals(element
+                    .getNamespaceURI())
+                    || !JbiConstants.WSDL11_WRAPPER_PART_LOCALNAME
+                            .equals(partWrapper.getLocalName())) {
+                throw new Fault(new Exception(
+                        "Unexpected part wrapper element '"
+                                + QNameUtil.toString(element) + "' expected '{"
+                                + JbiConstants.WSDL11_WRAPPER_NAMESPACE
+                                + "}part'"));
+            }
+            NodeList nodes = partWrapper.getChildNodes();
+            partsContent.add(nodes);
+        }
+
+        List<Header> headerList = message.getHeaders();
+        List<SoapHeaderInfo> headers = msg.getExtensors(SoapHeaderInfo.class);
+        for (SoapHeaderInfo header : headers) {
+            if (partsContent.size() == 0) {
+                break;
+            }
+
+            NodeList nl = partsContent.get(0);
+            if (header.getPart().getConcreteName().getNamespaceURI().equals(
+                    nl.item(0).getNamespaceURI())
+                    && header.getPart().getConcreteName().getLocalPart()
+                            .equals(nl.item(0).getLocalName())) {
+                headerList.add(new Header(header.getPart().getConcreteName(),
+                        nl.item(0)));
+                partsContent.remove(0);
+            }
+
+        }
+
+    }
+    
+    private boolean isRequestor(org.apache.cxf.message.Message message) {
+        return Boolean.TRUE.equals(message
+                .containsKey(org.apache.cxf.message.Message.REQUESTOR_ROLE));
+    }
+
+}

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java?rev=812411&r1=812410&r2=812411&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java Tue Sep  8 09:30:29 2009
@@ -24,7 +24,7 @@
 import java.util.logging.Logger;
 
 import javax.xml.namespace.QName;
-
+import javax.xml.ws.Holder;
 import junit.framework.TestCase;
 
 import org.apache.commons.httpclient.HttpClient;
@@ -150,8 +150,10 @@
         HelloRequest req = new HelloRequest();
         req.setText("hello");
         HelloHeader header = new HelloHeader();
+        Holder<HelloHeader> header1 = new Holder<HelloHeader>();
+        header1.value = header;
         header.setId("ffang");
-        HelloResponse rep = port.hello(req, header);
+        HelloResponse rep = port.hello(req, header1);
         Thread.sleep(1000);
         assertEquals(rep.getText(), "helloffang");
     }
@@ -181,10 +183,13 @@
         HelloRequest req = new HelloRequest();
         req.setText("hello");
         HelloHeader header = new HelloHeader();
+        Holder<HelloHeader> header1 = new Holder<HelloHeader>();        
+        header1.value = header;
         header.setId("ffang");
-        HelloResponse rep = port.hello(req, header);
+        HelloResponse rep = port.hello(req, header1);
         Thread.sleep(1000);
         assertEquals(rep.getText(), "helloffang");
+        assertEquals(header1.value.getId(), "retffang");
     }
 
     public void testEndpointRPC() throws Exception {

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java?rev=812411&r1=812410&r2=812411&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/GreeterImplForProvider.java Tue Sep  8 09:30:29 2009
@@ -83,8 +83,9 @@
                 req.setText("12");
                 HelloHeader header = new HelloHeader();
                 header.setId("345");
-                ret = ret + hello.hello(req, header).getText();
-            
+                Holder<HelloHeader> header1 = new Holder<HelloHeader>();
+                header1.value = header;
+                ret = ret + hello.hello(req, header1).getText(); 
             } else if ("https test".equals(me) || "provider security test".equals(me)) {
                 ret = ret + securityGreeter.greetMe("ffang");
             } else if ("concurrency test".equals(me)) {

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java?rev=812411&r1=812410&r2=812411&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java Tue Sep  8 09:30:29 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.servicemix.cxfbc;
 
+import javax.xml.ws.Holder;
+
 import uri.helloworld.HelloFault_Exception;
 import uri.helloworld.HelloHeader;
 import uri.helloworld.HelloPortType;
@@ -24,11 +26,14 @@
 
 public class HelloPortTypeImpl implements HelloPortType {
 
-    public HelloResponse hello(HelloRequest body, HelloHeader header1)
+   
+
+    public HelloResponse hello(HelloRequest body, Holder<HelloHeader> header1)
         throws HelloFault_Exception {
         HelloResponse rep = new HelloResponse();
-        rep.setText(body.getText() + header1.getId());
-        return rep;
+        rep.setText(body.getText() + header1.value.getId());
+        header1.value.setId("ret" + header1.value.getId());
+        return rep;    
     }
 
 }

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/ws/rm/CxfBcRMBasicTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/ws/rm/CxfBcRMBasicTest.java?rev=812411&r1=812410&r2=812411&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/ws/rm/CxfBcRMBasicTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/ws/rm/CxfBcRMBasicTest.java Tue Sep  8 09:30:29 2009
@@ -20,6 +20,7 @@
 import java.util.logging.Logger;
 
 import javax.xml.namespace.QName;
+import javax.xml.ws.Holder;
 
 import junit.framework.TestCase;
 
@@ -93,7 +94,9 @@
         req.setText("hello");
         HelloHeader header = new HelloHeader();
         header.setId("ffang");
-        HelloResponse rep = port.hello(req, header);
+        Holder<HelloHeader> header1 = new Holder<HelloHeader>();
+        header1.value = header;
+        HelloResponse rep = port.hello(req, header1);
         Thread.sleep(1000);
         assertEquals(rep.getText(), "helloffang");
     }

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/resources/HelloWorld-DOC.wsdl
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/resources/HelloWorld-DOC.wsdl?rev=812411&r1=812410&r2=812411&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/resources/HelloWorld-DOC.wsdl (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/bindingcomponents/servicemix-cxf-bc/src/test/resources/HelloWorld-DOC.wsdl Tue Sep  8 09:30:29 2009
@@ -71,6 +71,7 @@
 
     <message name="HelloResponse">
         <part name="body" element="tns:HelloResponse"/>
+        <part name="header1" element="tns:HelloHeader"/>
     </message>
 
     <message name="HelloFault">
@@ -100,6 +101,7 @@
             </input>
             <output>
                 <soap:body use="literal" parts="body"/>
+                <soap:header use="literal" message="tns:HelloResponse" part="header1"/>
             </output>
             <fault name="fault">
                 <soap:fault name="fault" use="literal" />