You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2013/08/30 04:59:22 UTC

[1/3] git commit: CAMEL-6684 fixed the issue of camel-cxf RAW message data format doesn't support MTOM

Updated Branches:
  refs/heads/camel-2.10.x 9f34fa65a -> a14bdbf04
  refs/heads/camel-2.11.x fc199ac74 -> 8845baf9a
  refs/heads/camel-2.12.x b119575e5 -> 1769ca1dd


CAMEL-6684 fixed the issue of camel-cxf RAW message data format doesn't support MTOM


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1769ca1d
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1769ca1d
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1769ca1d

Branch: refs/heads/camel-2.12.x
Commit: 1769ca1dd8eaca21a8e1dcb91b8530feb02309b1
Parents: b119575
Author: Willem Jiang <ni...@apache.org>
Authored: Fri Aug 30 10:43:40 2013 +0800
Committer: Willem Jiang <ni...@apache.org>
Committed: Fri Aug 30 10:48:12 2013 +0800

----------------------------------------------------------------------
 .../camel/component/cxf/DefaultCxfBinding.java  | 36 +++++++-
 .../cxf/mtom/CxfMtomRouterRawModeTest.java      | 46 ++++++++++
 .../mtom/CxfMtomRouterRawModeTest-context.xml   | 88 ++++++++++++++++++++
 3 files changed, 166 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/1769ca1d/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
index 1c65679..a595484 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
@@ -493,7 +493,7 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         Map<String, List<String>> cxfHeaders = CastUtils.cast((Map<?, ?>)cxfMessage.get(Message.PROTOCOL_HEADERS));
         Map<String, Object> camelHeaders = camelMessage.getHeaders();
         camelHeaders.put(CxfConstants.CAMEL_CXF_MESSAGE, cxfMessage);
-
+        
         if (cxfHeaders != null) {
             for (Map.Entry<String, List<String>> entry : cxfHeaders.entrySet()) {
                 if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), 
@@ -501,12 +501,19 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
                     // We need to filter the content type with multi-part, 
                     // as the multi-part stream is already consumed by AttachmentInInterceptor,
                     // it will cause some trouble when route this message to another CXF endpoint.
+                    
                     if ("Content-Type".compareToIgnoreCase(entry.getKey()) == 0
                         && entry.getValue().get(0) != null
                         && entry.getValue().get(0).startsWith("multipart/related")) {
-                        String contentType = replaceMultiPartContentType(entry.getValue().get(0));
-                        LOG.trace("Find the multi-part Conent-Type, and replace it with {}", contentType);
-                        camelHeaders.put(entry.getKey(), contentType);
+                        // We need to keep the Content-Type if the data format is RAW message
+                        DataFormat dataFormat = exchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.class);
+                        if (dataFormat.equals(DataFormat.RAW)) {
+                            camelHeaders.put(entry.getKey(), getContentTypeString(entry.getValue()));
+                        } else {
+                            String contentType = replaceMultiPartContentType(entry.getValue().get(0));
+                            LOG.trace("Find the multi-part Conent-Type, and replace it with {}", contentType);
+                            camelHeaders.put(entry.getKey(), contentType);
+                        }
                     } else {
                         LOG.trace("Populate header from CXF header={} value={}",
                                 entry.getKey(), entry.getValue());
@@ -581,6 +588,18 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         }
         return result;
     }
+    
+    protected String getContentTypeString(List<String> values) {
+        String result = "";
+        for (String value : values) {
+            if (result.length() == 0) {
+                result = value;
+            } else {
+                result = result + "; " + value;
+            }
+        }
+        return result;
+    }
 
     @SuppressWarnings("unchecked")
     protected void propagateHeadersFromCamelToCxf(Exchange camelExchange, 
@@ -601,6 +620,8 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         if (headers != null) {
             transportHeaders.putAll(headers);
         }
+        
+        DataFormat dataFormat = camelExchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.class);
             
         for (Map.Entry<String, Object> entry : camelHeaders.entrySet()) {
             // put response code in request context so it will be copied to CXF message's property
@@ -610,6 +631,13 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
                 continue;
             }
             
+            // We need to copy the content-type if the dataformat is RAW
+            if (Message.CONTENT_TYPE.equalsIgnoreCase(entry.getKey()) && dataFormat.equals(DataFormat.RAW)) {
+                LOG.debug("Propagate to CXF header: {} value: {}", Message.CONTENT_TYPE, entry.getValue());
+                cxfContext.put(Message.CONTENT_TYPE, entry.getValue().toString());
+                continue;
+            }
+            
             // need to filter the User-Agent ignore the case, as CXF just check the header with "User-Agent"
             if (entry.getKey().equalsIgnoreCase("User-Agent")) {
                 List<String> listValue = new ArrayList<String>();

http://git-wip-us.apache.org/repos/asf/camel/blob/1769ca1d/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
new file mode 100644
index 0000000..5ac6d97
--- /dev/null
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
@@ -0,0 +1,46 @@
+/**
+ * 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.camel.component.cxf.mtom;
+
+import java.net.URL;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.springframework.test.context.ContextConfiguration;
+
+import static org.junit.Assert.assertNotNull;
+
+
+@ContextConfiguration
+public class CxfMtomRouterRawModeTest extends CxfMtomRouterPayloadModeTest {
+    @Override
+    protected Hello getPort() {
+        URL wsdl = getClass().getResource("/mtom.wsdl");
+        assertNotNull("WSDL is null", wsdl);
+
+        HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+        assertNotNull("Service is null ", service);
+        Hello port = service.getHelloPort();
+        ((BindingProvider)port).getRequestContext()
+            .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                 "http://localhost:" + port1 + "/CxfMtomRouterRawModeTest/jaxws-mtom/hello");
+        return port;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/1769ca1d/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
new file mode 100644
index 0000000..ee8644b
--- /dev/null
+++ b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+
+  <!-- START SNIPPET: enableMtom -->
+
+   <cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:${CXFTestSupport.port1}/CxfMtomRouterRawModeTest/jaxws-mtom/hello"
+            wsdlURL="mtom.wsdl"
+            serviceName="ns:HelloService"
+            endpointName="ns:HelloPort"
+            xmlns:ns="http://apache.org/camel/cxf/mtom_feature">
+
+        <cxf:properties>
+            <!--  enable mtom by setting this property to true -->
+            <entry key="mtom-enabled" value="true"/>
+            
+            <!--  set the camel-cxf endpoint data fromat to RAW mode -->
+            <entry key="dataFormat" value="RAW"/>
+        </cxf:properties>      
+        
+  <!-- END SNIPPET: enableMtom -->
+                             
+<!--                   
+        <cxf:inInterceptors>
+		    <ref bean="logInbound"/>
+		</cxf:inInterceptors>	
+		<cxf:outInterceptors>
+		    <ref bean="logOutbound"/>
+		</cxf:outInterceptors>
+-->	
+   </cxf:cxfEndpoint>
+            
+   <cxf:cxfEndpoint id="serviceEndpoint" address="http://localhost:${CXFTestSupport.port2}/CxfMtomRouterRawModeTest/jaxws-mtom/hello"
+            wsdlURL="mtom.wsdl"
+            serviceName="ns:HelloService"
+            endpointName="ns:HelloPort"
+            xmlns:ns="http://apache.org/camel/cxf/mtom_feature">
+            
+        <cxf:properties>
+            <entry key="mtom-enabled" value="true"/>
+            <entry key="dataFormat" value="RAW"/>            
+        </cxf:properties>  
+
+<!--                          
+        <cxf:inInterceptors>
+		    <ref bean="logInbound"/>
+		</cxf:inInterceptors>	
+		<cxf:outInterceptors>
+		    <ref bean="logOutbound"/>
+		</cxf:outInterceptors>
+-->
+   </cxf:cxfEndpoint>                        
+
+   <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+      <route>
+          <from uri="cxf:bean:routerEndpoint" />
+          <to uri="cxf:bean:serviceEndpoint" />
+      </route>
+   </camelContext>
+   
+   <bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />         
+   <bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+
+</beans>
\ No newline at end of file


[2/3] git commit: CAMEL-6684 fixed the issue of camel-cxf RAW message data format doesn't support MTOM

Posted by ni...@apache.org.
CAMEL-6684 fixed the issue of camel-cxf RAW message data format doesn't support MTOM


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8845baf9
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8845baf9
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8845baf9

Branch: refs/heads/camel-2.11.x
Commit: 8845baf9ac39245c6a02102cec4cab589aef993b
Parents: fc199ac
Author: Willem Jiang <ni...@apache.org>
Authored: Fri Aug 30 10:43:40 2013 +0800
Committer: Willem Jiang <ni...@apache.org>
Committed: Fri Aug 30 10:49:14 2013 +0800

----------------------------------------------------------------------
 .../camel/component/cxf/DefaultCxfBinding.java  | 36 +++++++-
 .../cxf/mtom/CxfMtomRouterRawModeTest.java      | 46 ++++++++++
 .../mtom/CxfMtomRouterRawModeTest-context.xml   | 88 ++++++++++++++++++++
 3 files changed, 166 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/8845baf9/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
index 1c65679..a595484 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
@@ -493,7 +493,7 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         Map<String, List<String>> cxfHeaders = CastUtils.cast((Map<?, ?>)cxfMessage.get(Message.PROTOCOL_HEADERS));
         Map<String, Object> camelHeaders = camelMessage.getHeaders();
         camelHeaders.put(CxfConstants.CAMEL_CXF_MESSAGE, cxfMessage);
-
+        
         if (cxfHeaders != null) {
             for (Map.Entry<String, List<String>> entry : cxfHeaders.entrySet()) {
                 if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), 
@@ -501,12 +501,19 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
                     // We need to filter the content type with multi-part, 
                     // as the multi-part stream is already consumed by AttachmentInInterceptor,
                     // it will cause some trouble when route this message to another CXF endpoint.
+                    
                     if ("Content-Type".compareToIgnoreCase(entry.getKey()) == 0
                         && entry.getValue().get(0) != null
                         && entry.getValue().get(0).startsWith("multipart/related")) {
-                        String contentType = replaceMultiPartContentType(entry.getValue().get(0));
-                        LOG.trace("Find the multi-part Conent-Type, and replace it with {}", contentType);
-                        camelHeaders.put(entry.getKey(), contentType);
+                        // We need to keep the Content-Type if the data format is RAW message
+                        DataFormat dataFormat = exchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.class);
+                        if (dataFormat.equals(DataFormat.RAW)) {
+                            camelHeaders.put(entry.getKey(), getContentTypeString(entry.getValue()));
+                        } else {
+                            String contentType = replaceMultiPartContentType(entry.getValue().get(0));
+                            LOG.trace("Find the multi-part Conent-Type, and replace it with {}", contentType);
+                            camelHeaders.put(entry.getKey(), contentType);
+                        }
                     } else {
                         LOG.trace("Populate header from CXF header={} value={}",
                                 entry.getKey(), entry.getValue());
@@ -581,6 +588,18 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         }
         return result;
     }
+    
+    protected String getContentTypeString(List<String> values) {
+        String result = "";
+        for (String value : values) {
+            if (result.length() == 0) {
+                result = value;
+            } else {
+                result = result + "; " + value;
+            }
+        }
+        return result;
+    }
 
     @SuppressWarnings("unchecked")
     protected void propagateHeadersFromCamelToCxf(Exchange camelExchange, 
@@ -601,6 +620,8 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         if (headers != null) {
             transportHeaders.putAll(headers);
         }
+        
+        DataFormat dataFormat = camelExchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.class);
             
         for (Map.Entry<String, Object> entry : camelHeaders.entrySet()) {
             // put response code in request context so it will be copied to CXF message's property
@@ -610,6 +631,13 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
                 continue;
             }
             
+            // We need to copy the content-type if the dataformat is RAW
+            if (Message.CONTENT_TYPE.equalsIgnoreCase(entry.getKey()) && dataFormat.equals(DataFormat.RAW)) {
+                LOG.debug("Propagate to CXF header: {} value: {}", Message.CONTENT_TYPE, entry.getValue());
+                cxfContext.put(Message.CONTENT_TYPE, entry.getValue().toString());
+                continue;
+            }
+            
             // need to filter the User-Agent ignore the case, as CXF just check the header with "User-Agent"
             if (entry.getKey().equalsIgnoreCase("User-Agent")) {
                 List<String> listValue = new ArrayList<String>();

http://git-wip-us.apache.org/repos/asf/camel/blob/8845baf9/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
new file mode 100644
index 0000000..5ac6d97
--- /dev/null
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
@@ -0,0 +1,46 @@
+/**
+ * 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.camel.component.cxf.mtom;
+
+import java.net.URL;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.springframework.test.context.ContextConfiguration;
+
+import static org.junit.Assert.assertNotNull;
+
+
+@ContextConfiguration
+public class CxfMtomRouterRawModeTest extends CxfMtomRouterPayloadModeTest {
+    @Override
+    protected Hello getPort() {
+        URL wsdl = getClass().getResource("/mtom.wsdl");
+        assertNotNull("WSDL is null", wsdl);
+
+        HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+        assertNotNull("Service is null ", service);
+        Hello port = service.getHelloPort();
+        ((BindingProvider)port).getRequestContext()
+            .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                 "http://localhost:" + port1 + "/CxfMtomRouterRawModeTest/jaxws-mtom/hello");
+        return port;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8845baf9/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
new file mode 100644
index 0000000..ee8644b
--- /dev/null
+++ b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+
+  <!-- START SNIPPET: enableMtom -->
+
+   <cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:${CXFTestSupport.port1}/CxfMtomRouterRawModeTest/jaxws-mtom/hello"
+            wsdlURL="mtom.wsdl"
+            serviceName="ns:HelloService"
+            endpointName="ns:HelloPort"
+            xmlns:ns="http://apache.org/camel/cxf/mtom_feature">
+
+        <cxf:properties>
+            <!--  enable mtom by setting this property to true -->
+            <entry key="mtom-enabled" value="true"/>
+            
+            <!--  set the camel-cxf endpoint data fromat to RAW mode -->
+            <entry key="dataFormat" value="RAW"/>
+        </cxf:properties>      
+        
+  <!-- END SNIPPET: enableMtom -->
+                             
+<!--                   
+        <cxf:inInterceptors>
+		    <ref bean="logInbound"/>
+		</cxf:inInterceptors>	
+		<cxf:outInterceptors>
+		    <ref bean="logOutbound"/>
+		</cxf:outInterceptors>
+-->	
+   </cxf:cxfEndpoint>
+            
+   <cxf:cxfEndpoint id="serviceEndpoint" address="http://localhost:${CXFTestSupport.port2}/CxfMtomRouterRawModeTest/jaxws-mtom/hello"
+            wsdlURL="mtom.wsdl"
+            serviceName="ns:HelloService"
+            endpointName="ns:HelloPort"
+            xmlns:ns="http://apache.org/camel/cxf/mtom_feature">
+            
+        <cxf:properties>
+            <entry key="mtom-enabled" value="true"/>
+            <entry key="dataFormat" value="RAW"/>            
+        </cxf:properties>  
+
+<!--                          
+        <cxf:inInterceptors>
+		    <ref bean="logInbound"/>
+		</cxf:inInterceptors>	
+		<cxf:outInterceptors>
+		    <ref bean="logOutbound"/>
+		</cxf:outInterceptors>
+-->
+   </cxf:cxfEndpoint>                        
+
+   <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+      <route>
+          <from uri="cxf:bean:routerEndpoint" />
+          <to uri="cxf:bean:serviceEndpoint" />
+      </route>
+   </camelContext>
+   
+   <bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />         
+   <bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+
+</beans>
\ No newline at end of file


[3/3] git commit: CAMEL-6684 fixed the issue of camel-cxf RAW message data format doesn't support MTOM

Posted by ni...@apache.org.
CAMEL-6684 fixed the issue of camel-cxf RAW message data format doesn't support MTOM

Conflicts:

	components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a14bdbf0
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a14bdbf0
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a14bdbf0

Branch: refs/heads/camel-2.10.x
Commit: a14bdbf044a600ddd9ab216fd0310e7c28d63d6c
Parents: 9f34fa6
Author: Willem Jiang <ni...@apache.org>
Authored: Fri Aug 30 10:56:09 2013 +0800
Committer: Willem Jiang <ni...@apache.org>
Committed: Fri Aug 30 10:56:09 2013 +0800

----------------------------------------------------------------------
 .../camel/component/cxf/DefaultCxfBinding.java  | 43 +++++++++-
 .../cxf/mtom/CxfMtomRouterRawModeTest.java      | 46 ++++++++++
 .../mtom/CxfMtomRouterRawModeTest-context.xml   | 88 ++++++++++++++++++++
 3 files changed, 173 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/a14bdbf0/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
index b9f6524..d849fda 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
@@ -475,7 +475,7 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         Map<String, List<String>> cxfHeaders = CastUtils.cast((Map<?, ?>)cxfMessage.get(Message.PROTOCOL_HEADERS));
         Map<String, Object> camelHeaders = camelMessage.getHeaders();
         camelHeaders.put(CxfConstants.CAMEL_CXF_MESSAGE, cxfMessage);
-
+        
         if (cxfHeaders != null) {
             for (Map.Entry<String, List<String>> entry : cxfHeaders.entrySet()) {
                 if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), 
@@ -483,12 +483,19 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
                     // We need to filter the content type with multi-part, 
                     // as the multi-part stream is already consumed by AttachmentInInterceptor,
                     // it will cause some trouble when route this message to another CXF endpoint.
+                    
                     if ("Content-Type".compareToIgnoreCase(entry.getKey()) == 0
                         && entry.getValue().get(0) != null
                         && entry.getValue().get(0).startsWith("multipart/related")) {
-                        String contentType = replaceMultiPartContentType(entry.getValue().get(0));
-                        LOG.trace("Find the multi-part Conent-Type, and replace it with {}", contentType);
-                        camelHeaders.put(entry.getKey(), contentType);
+                        // We need to keep the Content-Type if the data format is RAW message
+                        DataFormat dataFormat = exchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.class);
+                        if (dataFormat.equals(DataFormat.RAW)) {
+                            camelHeaders.put(entry.getKey(), getContentTypeString(entry.getValue()));
+                        } else {
+                            String contentType = replaceMultiPartContentType(entry.getValue().get(0));
+                            LOG.trace("Find the multi-part Conent-Type, and replace it with {}", contentType);
+                            camelHeaders.put(entry.getKey(), contentType);
+                        }
                     } else {
                         LOG.trace("Populate header from CXF header={} value={}",
                                 entry.getKey(), entry.getValue());
@@ -545,6 +552,18 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         }
         return result;
     }
+    
+    protected String getContentTypeString(List<String> values) {
+        String result = "";
+        for (String value : values) {
+            if (result.length() == 0) {
+                result = value;
+            } else {
+                result = result + "; " + value;
+            }
+        }
+        return result;
+    }
 
     @SuppressWarnings("unchecked")
     protected void propagateHeadersFromCamelToCxf(Exchange camelExchange, 
@@ -565,6 +584,8 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
         if (headers != null) {
             transportHeaders.putAll(headers);
         }
+        
+        DataFormat dataFormat = camelExchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.class);
             
         for (Map.Entry<String, Object> entry : camelHeaders.entrySet()) {
             // put response code in request context so it will be copied to CXF message's property
@@ -574,6 +595,20 @@ public class DefaultCxfBinding implements CxfBinding, HeaderFilterStrategyAware
                 continue;
             }
             
+            // We need to copy the content-type if the dataformat is RAW
+            if (Message.CONTENT_TYPE.equalsIgnoreCase(entry.getKey()) && dataFormat.equals(DataFormat.RAW)) {
+                LOG.debug("Propagate to CXF header: {} value: {}", Message.CONTENT_TYPE, entry.getValue());
+                cxfContext.put(Message.CONTENT_TYPE, entry.getValue().toString());
+                continue;
+            }
+            
+            // need to filter the User-Agent ignore the case, as CXF just check the header with "User-Agent"
+            if (entry.getKey().equalsIgnoreCase("User-Agent")) {
+                List<String> listValue = new ArrayList<String>();
+                listValue.add(entry.getValue().toString());
+                transportHeaders.put("User-Agent", listValue);
+            }
+            
             // this header should be filtered, continue to the next header
             if (headerFilterStrategy.applyFilterToCamelHeaders(entry.getKey(), entry.getValue(), camelExchange)) {
                 continue;

http://git-wip-us.apache.org/repos/asf/camel/blob/a14bdbf0/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
new file mode 100644
index 0000000..5ac6d97
--- /dev/null
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest.java
@@ -0,0 +1,46 @@
+/**
+ * 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.camel.component.cxf.mtom;
+
+import java.net.URL;
+
+import javax.xml.ws.BindingProvider;
+
+import org.apache.camel.cxf.mtom_feature.Hello;
+import org.apache.camel.cxf.mtom_feature.HelloService;
+import org.springframework.test.context.ContextConfiguration;
+
+import static org.junit.Assert.assertNotNull;
+
+
+@ContextConfiguration
+public class CxfMtomRouterRawModeTest extends CxfMtomRouterPayloadModeTest {
+    @Override
+    protected Hello getPort() {
+        URL wsdl = getClass().getResource("/mtom.wsdl");
+        assertNotNull("WSDL is null", wsdl);
+
+        HelloService service = new HelloService(wsdl, HelloService.SERVICE);
+        assertNotNull("Service is null ", service);
+        Hello port = service.getHelloPort();
+        ((BindingProvider)port).getRequestContext()
+            .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+                 "http://localhost:" + port1 + "/CxfMtomRouterRawModeTest/jaxws-mtom/hello");
+        return port;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a14bdbf0/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
new file mode 100644
index 0000000..ee8644b
--- /dev/null
+++ b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/mtom/CxfMtomRouterRawModeTest-context.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:cxf="http://camel.apache.org/schema/cxf"
+
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+
+  <!-- START SNIPPET: enableMtom -->
+
+   <cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:${CXFTestSupport.port1}/CxfMtomRouterRawModeTest/jaxws-mtom/hello"
+            wsdlURL="mtom.wsdl"
+            serviceName="ns:HelloService"
+            endpointName="ns:HelloPort"
+            xmlns:ns="http://apache.org/camel/cxf/mtom_feature">
+
+        <cxf:properties>
+            <!--  enable mtom by setting this property to true -->
+            <entry key="mtom-enabled" value="true"/>
+            
+            <!--  set the camel-cxf endpoint data fromat to RAW mode -->
+            <entry key="dataFormat" value="RAW"/>
+        </cxf:properties>      
+        
+  <!-- END SNIPPET: enableMtom -->
+                             
+<!--                   
+        <cxf:inInterceptors>
+		    <ref bean="logInbound"/>
+		</cxf:inInterceptors>	
+		<cxf:outInterceptors>
+		    <ref bean="logOutbound"/>
+		</cxf:outInterceptors>
+-->	
+   </cxf:cxfEndpoint>
+            
+   <cxf:cxfEndpoint id="serviceEndpoint" address="http://localhost:${CXFTestSupport.port2}/CxfMtomRouterRawModeTest/jaxws-mtom/hello"
+            wsdlURL="mtom.wsdl"
+            serviceName="ns:HelloService"
+            endpointName="ns:HelloPort"
+            xmlns:ns="http://apache.org/camel/cxf/mtom_feature">
+            
+        <cxf:properties>
+            <entry key="mtom-enabled" value="true"/>
+            <entry key="dataFormat" value="RAW"/>            
+        </cxf:properties>  
+
+<!--                          
+        <cxf:inInterceptors>
+		    <ref bean="logInbound"/>
+		</cxf:inInterceptors>	
+		<cxf:outInterceptors>
+		    <ref bean="logOutbound"/>
+		</cxf:outInterceptors>
+-->
+   </cxf:cxfEndpoint>                        
+
+   <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+      <route>
+          <from uri="cxf:bean:routerEndpoint" />
+          <to uri="cxf:bean:serviceEndpoint" />
+      </route>
+   </camelContext>
+   
+   <bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />         
+   <bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+
+</beans>
\ No newline at end of file