camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From acosent...@apache.org
Subject [1/4] camel git commit: CAMEL-10679
Date Mon, 09 Jan 2017 14:59:36 GMT
Repository: camel
Updated Branches:
  refs/heads/camel-2.18.x 5eb6868f6 -> f325b67fa


CAMEL-10679

Producer does not populate attachments from response

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

Branch: refs/heads/camel-2.18.x
Commit: 18fe8329ef46a4d84e0914052dfbcc93664941ab
Parents: 94b4e6f
Author: marcusmesserkewill <marcus.messer@kewill.com>
Authored: Fri Jan 6 10:30:48 2017 +0100
Committer: marcusmesserkewill <marcus.messer@kewill.com>
Committed: Fri Jan 6 10:30:48 2017 +0100

----------------------------------------------------------------------
 .../ws/SpringWebserviceConfiguration.java       | 21 ++++++-
 .../spring/ws/SpringWebserviceProducer.java     | 41 ++++++++++---
 .../ws/SoapAttachmentResponseProcessor.java     | 37 +++++++++++
 .../spring/ws/SoapResponseAttachmentTest.java   | 64 ++++++++++++++++++++
 .../ws/SoapResponseAttachmentTest-context.xml   | 53 ++++++++++++++++
 5 files changed, 205 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/18fe8329/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
b/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
index ae61fcc..ebaec3d 100644
--- a/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
+++ b/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
@@ -72,7 +72,9 @@ public class SpringWebserviceConfiguration {
     private int timeout = -1;
     @UriParam(label = "producer")
     private boolean allowResponseHeaderOverride;
-
+    @UriParam(label = "producer")
+    private boolean allowResponseAttachmentOverride;
+    
     /* Consumer configuration */
     @UriParam(label = "consumer")
     private EndpointMappingKey endpointMappingKey;
@@ -401,5 +403,22 @@ public class SpringWebserviceConfiguration {
     public void setAllowResponseHeaderOverride(boolean allowResponseHeaderOverride) {
         this.allowResponseHeaderOverride = allowResponseHeaderOverride;
     }
+    /**
+     * @return boolean - true, will override attachments with spring-ws response message
attachments
+     */
+    public boolean isAllowResponseAttachmentOverride() {
+        return allowResponseAttachmentOverride;
+    }
 
+    /**
+     * Option to override soap response attachments in in/out exchange with attachments info
the actual service layer.
+     * If the invoked service appends or rewrites the soap attachments this option when set
to true, allows the modified
+     * soap attachments to be overwritten in in/out message attachments
+     * 
+     * @param allowResponseAttachmentOverride
+     *            - true, will override attachments with spring-ws response message attachments
+     */
+    public void setAllowResponseAttachmentOverride(boolean allowResponseAttachmentOverride)
{
+        this.allowResponseAttachmentOverride = allowResponseAttachmentOverride;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/18fe8329/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java
b/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java
index 489397c..b1a4a16 100644
--- a/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java
+++ b/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java
@@ -41,6 +41,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.ws.WebServiceMessage;
 import org.springframework.ws.client.core.WebServiceMessageCallback;
 import org.springframework.ws.client.core.WebServiceTemplate;
+import org.springframework.ws.mime.Attachment;
 import org.springframework.ws.soap.SoapHeader;
 import org.springframework.ws.soap.SoapHeaderElement;
 import org.springframework.ws.soap.SoapMessage;
@@ -98,21 +99,30 @@ public class SpringWebserviceProducer extends DefaultProducer {
             public void doWithMessage(WebServiceMessage responseMessage) throws IOException,
TransformerException {
                 SoapMessage soapMessage = (SoapMessage) responseMessage;
                 if (ExchangeHelper.isOutCapable(exchange)) {
-                    exchange.getOut().copyFromWithNewBody(exchange.getIn(), responseMessage.getPayloadSource());
-                    if (soapMessage.getSoapHeader() != null && getEndpoint().getConfiguration().isAllowResponseHeaderOverride())
{
-                        populateMessageHeaderFromResponse(exchange.getOut(), soapMessage.getSoapHeader());
-                    }
+                    exchange.getOut().copyFromWithNewBody(exchange.getIn(), soapMessage.getPayloadSource());
+                    processHeaderAndAttachments(exchange.getOut(), soapMessage);
                 } else {
-                    exchange.getIn().setBody(responseMessage.getPayloadSource());
-                    if (soapMessage.getSoapHeader() != null && getEndpoint().getConfiguration().isAllowResponseHeaderOverride())
{
-                        populateMessageHeaderFromResponse(exchange.getIn(), soapMessage.getSoapHeader());
-                    }
+                    exchange.getIn().setBody(soapMessage.getPayloadSource());
+                    processHeaderAndAttachments(exchange.getIn(), soapMessage);
                 }
 
             }
         });
     }
-
+    /**
+     * Populates soap message headers and attachments from soap response
+     * @param inOrOut {@link Message}
+     * @param soapMessage {@link SoapMessage}
+     */
+    private void processHeaderAndAttachments(Message inOrOut, SoapMessage soapMessage) {
+    	 if (soapMessage.getSoapHeader() != null && getEndpoint().getConfiguration().isAllowResponseHeaderOverride())
{ 
+    		 populateMessageHeaderFromResponse(inOrOut, soapMessage.getSoapHeader());
+    	 }
+    	 if (soapMessage.getAttachments() != null && getEndpoint().getConfiguration().isAllowResponseAttachmentOverride())
{
+    		 populateMessageAttachmentsFromResponse(inOrOut, soapMessage.getAttachments());
+    	 }
+    }
+    
     /**
      * Populates message headers from soapHeader response
      * 
@@ -139,7 +149,18 @@ public class SpringWebserviceProducer extends DefaultProducer {
 
         }
     }
-
+    /**
+     * Populates message attachments from soap response attachments 
+     * @param inOrOut {@link Message}
+     * @param soapMessage {@link SoapMessage}
+     */
+    private void populateMessageAttachmentsFromResponse(Message inOrOut, Iterator<Attachment>
attachments) {
+    	while (attachments.hasNext()) {
+    		Attachment attachment = attachments.next();
+    		inOrOut.getAttachments().put(attachment.getContentId(), attachment.getDataHandler());
+    	}
+    }    
+    
     private void prepareMessageSenders(SpringWebserviceConfiguration configuration) {
         // Skip this whole thing if none of the relevant config options are set.
         if (!(configuration.getTimeout() > -1) && configuration.getSslContextParameters()
== null) {

http://git-wip-us.apache.org/repos/asf/camel/blob/18fe8329/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SoapAttachmentResponseProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SoapAttachmentResponseProcessor.java
b/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SoapAttachmentResponseProcessor.java
new file mode 100644
index 0000000..ad52eb9
--- /dev/null
+++ b/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SoapAttachmentResponseProcessor.java
@@ -0,0 +1,37 @@
+/**
+ * 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.spring.ws;
+
+import javax.activation.DataHandler;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+/**
+ * Returns the request as the response so it can be analysed (eg. for presence
+ * of SOAP Headers). 
+ * Also adds 2 attachments to the out message, which could be returned in a soap message
by a ws request.
+ */
+public class SoapAttachmentResponseProcessor implements Processor {
+
+    public void process(Exchange exchange) throws Exception {
+        exchange.setOut(exchange.getIn());
+        exchange.getOut().addAttachment("responseAttachment1.txt", new DataHandler("responseAttachment1",
"text/plain"));
+        exchange.getOut().addAttachment("responseAttachment2.xml", new DataHandler("<responseAttachment2/>",
"application/xml"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/18fe8329/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SoapResponseAttachmentTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SoapResponseAttachmentTest.java
b/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SoapResponseAttachmentTest.java
new file mode 100644
index 0000000..6ec1ca8
--- /dev/null
+++ b/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SoapResponseAttachmentTest.java
@@ -0,0 +1,64 @@
+/**
+ * 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.spring.ws;
+
+import static org.junit.Assert.assertNotNull;
+
+import javax.activation.DataHandler;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.junit.Test;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
+
+@ContextConfiguration
+public class SoapResponseAttachmentTest extends AbstractJUnit4SpringContextTests {
+
+    private final String xmlRequestForGoogleStockQuote = "<GetQuote xmlns=\"http://www.webserviceX.NET/\"><symbol>GOOG</symbol></GetQuote>";
+    private final String soapHeader = "<h:Header xmlns:h=\"http://www.webserviceX.NET/\"><h:MessageID>1234567890</h:MessageID><h:Nested><h:NestedID>1111</h:NestedID></h:Nested></h:Header>";
+
+    @Produce
+    private ProducerTemplate template;
+
+    /**
+     * This tests if attachments, returned by a spring-ws request, are populated into the
exchange. 
+     * The SOAP attachments are populated by the SoapAttachmentResponseProcessor. 
+     * Which adds 2 response attachments.
+     * Note: 'allowResponseAttachmentOverride=true' must be set!
+     *
+     * @throws Exception
+     */
+    @Test()
+    public void consumeStockQuoteWebserviceWithSoapHeader() throws Exception {
+        Exchange result = template.request("direct:stockQuoteWebservice", new Processor()
{
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody(xmlRequestForGoogleStockQuote);
+                exchange.getIn().setHeader(SpringWebserviceConstants.SPRING_WS_SOAP_HEADER,
soapHeader);
+                exchange.getIn().addAttachment("requestAttachment1.txt", new DataHandler("hello
attachment!", "text/plain"));
+            }
+        });
+        assertNotNull(result);
+        assertNotNull(result.getOut().getAttachment("requestAttachment1.txt"));
+        assertNotNull(result.getOut().getAttachment("responseAttachment1.txt"));
+        assertNotNull(result.getOut().getAttachment("responseAttachment2.xml"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/18fe8329/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SoapResponseAttachmentTest-context.xml
----------------------------------------------------------------------
diff --git a/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SoapResponseAttachmentTest-context.xml
b/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SoapResponseAttachmentTest-context.xml
new file mode 100644
index 0000000..3bee89e
--- /dev/null
+++ b/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SoapResponseAttachmentTest-context.xml
@@ -0,0 +1,53 @@
+<?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"
+       xsi:schemaLocation="
+         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <!-- producer routes (web service clients) -->
+        <route>
+            <from uri="direct:stockQuoteWebservice"/>
+            <to uri="spring-ws:http://localhost?webServiceTemplate=#webServiceTemplate&amp;soapAction=http://www.stockquotes.edu/GetQuote&amp;allowResponseAttachmentOverride=true"/>
+        </route>
+
+        <!-- consumer route (providing the actual web service) that responds with the
request so we can see SOAP headers -->
+        <route>
+            <from uri="spring-ws:soapaction:http://www.stockquotes.edu/GetQuote?endpointMapping=#endpointMapping"/>
+            <to uri="responseProcessor"/>
+        </route>
+    </camelContext>
+
+    <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>
+
+    <bean id="endpointMapping"
+          class="org.apache.camel.component.spring.ws.bean.CamelEndpointMapping"/>
+
+    <bean id="responseProcessor"
+          class="org.apache.camel.component.spring.ws.SoapAttachmentResponseProcessor"/>
+
+    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
+        <property name="defaultUri" value="http://localhost"/>
+        <property name="messageSender">
+            <bean class="net.javacrumbs.springws.test.helper.InMemoryWebServiceMessageSender"/>
+        </property>
+    </bean>
+
+</beans>
\ No newline at end of file


Mime
View raw message