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" />