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 2012/11/20 15:41:45 UTC

svn commit: r1411686 - in /camel/trunk/components/camel-spring-ws: ./ src/main/java/org/apache/camel/component/spring/ws/ src/main/java/org/apache/camel/component/spring/ws/filter/impl/ src/test/java/org/apache/camel/component/spring/ws/ src/test/java/...

Author: ningjiang
Date: Tue Nov 20 14:41:43 2012
New Revision: 1411686

URL: http://svn.apache.org/viewvc?rev=1411686&view=rev
Log:
CAMEL-5724 Added test patch with thanks to Andrej

Added:
    camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilter.java
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingDefaultsTest.java
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingTest.java
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/EmptyMessageFilter.java
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/GlobalMessageFilter.java
    camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/LocalMessageFilter.java
    camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/DefaultMessageFilter-context.xml
    camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/MessageFilter-context.xml
    camel/trunk/components/camel-spring-ws/src/test/resources/sampleAttachment.txt
Removed:
    camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/filter/impl/BasicFilterStrategy.java
Modified:
    camel/trunk/components/camel-spring-ws/pom.xml
    camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceComponent.java
    camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java

Modified: camel/trunk/components/camel-spring-ws/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/pom.xml?rev=1411686&r1=1411685&r2=1411686&view=diff
==============================================================================
--- camel/trunk/components/camel-spring-ws/pom.xml (original)
+++ camel/trunk/components/camel-spring-ws/pom.xml Tue Nov 20 14:41:43 2012
@@ -124,6 +124,18 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+			<groupId>net.javacrumbs</groupId>
+			<artifactId>smock-springws</artifactId>
+			<version>0.5</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.easytesting</groupId>
+			<artifactId>fest-assert</artifactId>
+			<version>1.4</version>
+			<scope>test</scope>
+		</dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>

Modified: camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceComponent.java?rev=1411686&r1=1411685&r2=1411686&view=diff
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceComponent.java (original)
+++ camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceComponent.java Tue Nov 20 14:41:43 2012
@@ -68,8 +68,8 @@ public class SpringWebserviceComponent e
         addConsumerConfiguration(remaining, parameters, configuration);
         addProducerConfiguration(remaining, parameters, configuration);
         addXmlConverterToConfiguration(parameters, configuration);
-        setProperties(configuration, parameters);
         configureMessageFilter(parameters, configuration); 
+        setProperties(configuration, parameters);
         return new SpringWebserviceEndpoint(this, uri, configuration);
     }
 

Modified: camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java?rev=1411686&r1=1411685&r2=1411686&view=diff
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java (original)
+++ camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java Tue Nov 20 14:41:43 2012
@@ -22,7 +22,7 @@ import java.net.URISyntaxException;
 import org.apache.camel.component.spring.ws.bean.CamelEndpointDispatcher;
 import org.apache.camel.component.spring.ws.bean.CamelEndpointMapping;
 import org.apache.camel.component.spring.ws.filter.MessageFilter;
-import org.apache.camel.component.spring.ws.filter.impl.BasicFilterStrategy;
+import org.apache.camel.component.spring.ws.filter.impl.BasicMessageFilter;
 import org.apache.camel.component.spring.ws.type.EndpointMappingKey;
 import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.util.jsse.SSLContextParameters;
@@ -161,7 +161,7 @@ public class SpringWebserviceConfigurati
      */
     public MessageFilter getMessageFilter() {
         if (this.messageFilter == null) {
-            this.messageFilter = new BasicFilterStrategy();
+            this.messageFilter = new BasicMessageFilter();
         }
         return this.messageFilter;
     }

Added: camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilter.java?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilter.java (added)
+++ camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilter.java Tue Nov 20 14:41:43 2012
@@ -0,0 +1,133 @@
+package org.apache.camel.component.spring.ws.filter.impl;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.activation.DataHandler;
+import javax.xml.namespace.QName;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.component.spring.ws.SpringWebserviceConstants;
+import org.apache.camel.component.spring.ws.filter.MessageFilter;
+import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.soap.SoapHeader;
+import org.springframework.ws.soap.SoapMessage;
+
+/**
+ * This class populates a SOAP header and attachments in the WebServiceMessage instance.
+ * 
+ * @author andrej@chocolatejar.eu
+ * 
+ */
+public class BasicMessageFilter implements MessageFilter {
+	private static final String LOWERCASE_BREADCRUMB_ID = "breadcrumbid";
+
+	@Override
+	public void filterProducer(Exchange exchange, WebServiceMessage response) {
+		if (exchange != null) {
+			processHeaderAndAttachments(exchange.getIn(), response);
+		}
+	}
+
+	@Override
+	public void filterConsumer(Exchange exchange, WebServiceMessage response) {
+		if (exchange != null) {
+			processHeaderAndAttachments(exchange.getOut(), response);
+		}
+	}
+
+	/**
+	 * If applicable this method adds a SOAP headers and attachments.
+	 * 
+	 * @param inOrOut
+	 * @param response
+	 */
+	protected void processHeaderAndAttachments(Message inOrOut,
+			WebServiceMessage response) {
+
+		if (response instanceof SoapMessage) {
+			SoapMessage soapMessage = (SoapMessage) response;
+			processSoapHeader(inOrOut, soapMessage);
+			doProcessSoapAttachments(inOrOut, soapMessage);
+		}
+	}
+
+	/**
+	  * If applicable this method adds a SOAP header.
+	 * 
+	 * @param inOrOut
+	 * @param soapMessage
+	 */
+	protected void processSoapHeader(Message inOrOut, SoapMessage soapMessage) {
+		boolean isHeaderAvailable = inOrOut != null
+				&& inOrOut.getHeaders() != null
+				&& !inOrOut.getHeaders().isEmpty();
+
+		if (isHeaderAvailable) {
+			doProcessSoapHeader(inOrOut, soapMessage);
+		}
+	}
+
+	/**
+	 * The SOAP header is populated from exchange.getOut().getHeaders() if this
+	 * class is used by the consumer or exchange.getIn().getHeaders() if this
+	 * class is used by the producer.
+	 * 
+	 * If .getHeaders() contains under a certain key a value with the QName
+	 * object, it is directly added as a new header element. If it contains only
+	 * a String value, it is transformed into a header attribute.
+	 * 
+	 * Following headers are excluded: {@code LOWERCASE_BREADCRUMB_ID}
+	 * 
+	 * @see SpringWebserviceConstants.SPRING_WS_SOAP_ACTION, @see
+	 *      SpringWebserviceConstants.SPRING_WS_ADDRESSING_ACTION), @see
+	 *      SpringWebserviceConstants.SPRING_WS_ENDPOINT_URI
+	 * 
+	 * This the convinient method for overriding.
+	 * @param inOrOut
+	 * @param soapMessage
+	 */
+	protected void doProcessSoapHeader(Message inOrOut, SoapMessage soapMessage) {
+		SoapHeader soapHeader = soapMessage.getSoapHeader();
+
+		Map<String, Object> headers = inOrOut.getHeaders();
+
+		HashSet<String> headerKeySet = new HashSet<String>(headers.keySet());
+
+		headerKeySet.remove(SpringWebserviceConstants.SPRING_WS_SOAP_ACTION.toLowerCase());
+		headerKeySet.remove(SpringWebserviceConstants.SPRING_WS_ADDRESSING_ACTION.toLowerCase());
+		headerKeySet.remove(SpringWebserviceConstants.SPRING_WS_ENDPOINT_URI.toLowerCase());
+
+		headerKeySet.remove(LOWERCASE_BREADCRUMB_ID);
+
+		for (String name : headerKeySet) {
+			Object value = headers.get(name);
+
+			if (value instanceof QName) {
+				soapHeader.addHeaderElement((QName) value);
+			} else {
+				if (value instanceof String) {
+					soapHeader.addAttribute(new QName(name), value + "");
+				}
+			}
+		}
+	}
+
+	/**
+	 * Populate SOAP attachments from in or out exchange message. This the convenient method for overriding.
+	 * 
+	 * @param inOrOut
+	 * @param response
+	 */
+	protected void doProcessSoapAttachments(Message inOrOut, SoapMessage response) {
+		Map<String, DataHandler> attachments = inOrOut.getAttachments();
+
+		Set<String> keySet = new HashSet<String>(attachments.keySet());
+		for (String key : keySet) {
+			response.addAttachment(key, attachments.get(key));
+		}
+	}
+
+}

Added: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingDefaultsTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingDefaultsTest.java?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingDefaultsTest.java (added)
+++ camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingDefaultsTest.java Tue Nov 20 14:41:43 2012
@@ -0,0 +1,75 @@
+package org.apache.camel.component.spring.ws;
+
+import java.io.IOException;
+import java.net.URI;
+
+import javax.xml.namespace.QName;
+
+import net.javacrumbs.smock.springws.client.AbstractSmockClientTest;
+
+import org.apache.camel.ProducerTemplate;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.test.client.RequestMatcher;
+
+/**
+ * Check if the MessageFilter is used and resolved from endpoint uri or global context configuration.
+ * 
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:org/apache/camel/component/spring/ws/DefaultMessageFilter-context.xml" })
+public class MessageFilterResolvingDefaultsTest extends AbstractSmockClientTest {
+
+	private String body = "<customerCountRequest xmlns='http://springframework.org/spring-ws'>"
+			+ "<customerName>John Doe</customerName>"
+			+ "</customerCountRequest>";
+
+	
+	@Test
+	public void isUsedDefaultFilter() {
+		expect(soapHeader(new QName("http://newHeaderSupport/", "testHeaderValue1")))
+		.andExpect(doesntContains(soapHeader(new QName("http://virtualCheck/", "localFilter"))))
+		.andExpect(doesntContains(soapHeader(new QName("http://virtualCheck/", "globalFilter"))));
+		
+		template.sendBodyAndHeader("direct:sendDefault", body,
+				"headerKey", new QName("http://newHeaderSupport/", "testHeaderValue1"));
+		
+	}
+
+	
+	private RequestMatcher doesntContains(final RequestMatcher soapHeader) {
+		return new RequestMatcher() {
+			public void match(URI uri, WebServiceMessage request)
+					throws IOException, AssertionError {
+				try {
+					soapHeader.match(uri, request);
+
+				} catch (AssertionError e) {
+					// ok
+					return;
+				}
+				throw new AssertionError("Should failed!");
+			}
+		};
+	}
+
+	@Autowired
+	private ProducerTemplate template;
+
+	@Autowired
+	public void setApplicationContext(ApplicationContext applicationContext) {
+		createServer(applicationContext);
+	}
+
+	@After
+	public void verify() {
+		super.verify();
+	}
+}
\ No newline at end of file

Added: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingTest.java?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingTest.java (added)
+++ camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/MessageFilterResolvingTest.java Tue Nov 20 14:41:43 2012
@@ -0,0 +1,92 @@
+package org.apache.camel.component.spring.ws;
+
+import java.io.IOException;
+import java.net.URI;
+
+import javax.xml.namespace.QName;
+
+import net.javacrumbs.smock.springws.client.AbstractSmockClientTest;
+
+import org.apache.camel.ProducerTemplate;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.test.client.RequestMatcher;
+
+/**
+ * Check if the MessageFilter is used and resolved from endpoint uri or global context configuration.
+ * 
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:org/apache/camel/component/spring/ws/MessageFilter-context.xml" })
+public class MessageFilterResolvingTest extends AbstractSmockClientTest {
+
+	private String body = "<customerCountRequest xmlns='http://springframework.org/spring-ws'>"
+			+ "<customerName>John Doe</customerName>"
+			+ "</customerCountRequest>";
+
+	@Test
+	public void global_testHeaderAttribute() {
+		expect(soapHeader(new QName("http://newHeaderSupport/", "testHeaderValue1")))
+		.andExpect(soapHeader(new QName("http://virtualCheck/", "globalFilter")));
+		
+		template.sendBodyAndHeader("direct:sendWithGlobalFilter", body,
+				"headerKey", new QName("http://newHeaderSupport/", "testHeaderValue1"));
+	}
+
+	@Test
+	public void local_testHeaderAttribute() {
+		expect(soapHeader(new QName("http://newHeaderSupport/", "testHeaderValue1")))
+		.andExpect(soapHeader(new QName("http://virtualCheck/", "localFilter")));
+		
+		template.sendBodyAndHeader("direct:sendWithLocalFilter", body,
+				"headerKey", new QName("http://newHeaderSupport/", "testHeaderValue1"));
+
+	}
+	
+
+	@Test
+	public void empty_testHeaderAttribute() {
+		expect(doesntContains(soapHeader(new QName("http://newHeaderSupport/",
+				"testHeaderValue1"))));
+
+		template.sendBodyAndHeader("direct:sendWithoutFilter", body,
+				"headerKey", new QName("http://newHeaderSupport/", "testHeaderValue1"));
+
+	}
+
+	private RequestMatcher doesntContains(final RequestMatcher soapHeader) {
+		return new RequestMatcher() {
+			public void match(URI uri, WebServiceMessage request)
+					throws IOException, AssertionError {
+				try {
+					soapHeader.match(uri, request);
+
+				} catch (AssertionError e) {
+					// ok
+					return;
+				}
+				throw new AssertionError("Should failed!");
+			}
+		};
+	}
+
+	@Autowired
+	private ProducerTemplate template;
+
+	@Autowired
+	public void setApplicationContext(ApplicationContext applicationContext) {
+		createServer(applicationContext);
+	}
+
+	@After
+	public void verify() {
+		super.verify();
+	}
+}
\ No newline at end of file

Added: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java (added)
+++ camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java Tue Nov 20 14:41:43 2012
@@ -0,0 +1,167 @@
+package org.apache.camel.component.spring.ws.filter.impl;
+
+import javax.activation.DataHandler;
+import javax.xml.namespace.QName;
+
+import org.apache.camel.component.spring.ws.SpringWebserviceConstants;
+import org.apache.camel.test.junit4.ExchangeTestSupport;
+import org.fest.assertions.Assertions;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.springframework.ws.pox.dom.DomPoxMessage;
+import org.springframework.ws.pox.dom.DomPoxMessageFactory;
+import org.springframework.ws.soap.SoapMessage;
+import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
+
+@RunWith(value = JUnit4.class)
+public class BasicMessageFilterTest extends ExchangeTestSupport {
+
+	private BasicMessageFilter filter;
+	private SoapMessage message;
+
+	@Before
+	public void Before() {
+		filter = new BasicMessageFilter();
+		SaajSoapMessageFactory saajSoapMessageFactory = new SaajSoapMessageFactory();
+		saajSoapMessageFactory.afterPropertiesSet();
+		message = saajSoapMessageFactory.createWebServiceMessage();
+	}
+
+	@Test
+	public void testNulls() throws Exception {
+		filter.filterConsumer(null, null);
+		filter.filterProducer(null, null);
+	}
+
+	@Test
+	public void testNullsWithExchange() throws Exception {
+		filter.filterConsumer(exchange, null);
+		filter.filterProducer(exchange, null);
+	}
+
+	@Test
+	public void NonSoapMessageShouldBeSkipped() throws Exception {
+		DomPoxMessage domPoxMessage = new DomPoxMessageFactory()
+				.createWebServiceMessage();
+		filter.filterConsumer(exchange, domPoxMessage);
+		filter.filterProducer(exchange, domPoxMessage);
+
+	}
+
+	@Test
+	public void withoutHeader() throws Exception {
+		exchange.getIn().getHeaders().clear();
+		exchange.getOut().getHeaders().clear();
+
+		exchange.getIn().getAttachments().clear();
+		exchange.getOut().getAttachments().clear();
+
+		filter.filterProducer(exchange, message);
+		filter.filterConsumer(exchange, message);
+
+		Assertions.assertThat(message.getAttachments()).isEmpty();
+		Assertions.assertThat(message.getSoapHeader().examineAllHeaderElements()).isEmpty();
+
+		Assertions.assertThat(message.getSoapHeader().getAllAttributes()).isEmpty();
+	}
+	
+
+	@Test
+	public void removeCamelInternalHeaderAttributes() throws Exception {
+		exchange.getOut()
+				.getHeaders()
+				.put(SpringWebserviceConstants.SPRING_WS_SOAP_ACTION,
+						"mustBeRemoved");
+		exchange.getOut()
+				.getHeaders()
+				.put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_ACTION,
+						"mustBeRemoved");
+		exchange.getOut()
+				.getHeaders()
+				.put(SpringWebserviceConstants.SPRING_WS_ENDPOINT_URI,
+						"mustBeRemoved");
+
+		exchange.getOut().getHeaders().put("breadcrumbId", "mustBeRemoved");
+
+		filter.filterConsumer(exchange, message);
+
+		Assertions.assertThat(message.getAttachments()).isEmpty();
+		Assertions.assertThat(message.getSoapHeader().examineAllHeaderElements()).isEmpty();
+
+		Assertions.assertThat(message.getSoapHeader().getAllAttributes()).isEmpty();
+	}
+
+	@Test
+	public void consumer_withHeader() throws Exception {
+		exchange.getOut().getHeaders()
+				.put("headerAttributeKey", "testAttributeValue");
+		exchange.getOut()
+				.getHeaders()
+				.put("headerAttributeElement",
+						new QName("http://shouldBeInHeader", "<myElement />"));
+		filter.filterConsumer(exchange, message);
+
+		Assertions.assertThat(message.getAttachments()).isEmpty();
+
+		Assertions.assertThat(message.getSoapHeader().examineAllHeaderElements())
+		.isNotEmpty().hasSize(1);
+
+		Assertions.assertThat(message.getSoapHeader().getAllAttributes())
+		.isNotEmpty().hasSize(1);
+
+	}
+
+	@Test
+	public void producer_withHeader() throws Exception {
+		// foo is already in the header.in from the parent ExchangeTestSupport
+		exchange.getIn().getHeaders()
+				.put("headerAttributeKey", "testAttributeValue");
+		exchange.getIn()
+				.getHeaders()
+				.put("headerAttributeElement",
+						new QName("http://shouldBeInHeader", "<myElement />"));
+
+		filter.filterProducer(exchange, message);
+
+		Assertions.assertThat(message.getAttachments()).isEmpty();
+
+		Assertions.assertThat(message.getSoapHeader().examineAllHeaderElements())
+		.isNotEmpty().hasSize(1);
+
+		Assertions.assertThat(message.getSoapHeader().getAllAttributes())
+		.isNotEmpty().hasSize(2);
+
+	}
+
+	@Test
+	public void withoutAttachment() throws Exception {
+		filter.filterConsumer(exchange, message);
+		filter.filterProducer(exchange, message);
+
+		Assertions.assertThat(message.getAttachments()).isEmpty();
+	}
+
+	@Test
+	public void producer_withAttachment() throws Exception {
+		exchange.getIn().addAttachment(	"testAttachment",
+				new DataHandler(this.getClass().getResource("/sampleAttachment.txt")));
+		
+		filter.filterProducer(exchange, message);
+		
+		Assertions.assertThat(message.getAttachments()).isNotNull().isNotEmpty();
+		Assertions.assertThat(message.getAttachment("testAttachment")).isNotNull();
+	}
+
+	@Test
+	public void consumer_withAttachment() throws Exception {
+		exchange.getOut().addAttachment(	"testAttachment",
+				new DataHandler(this.getClass().getResource("/sampleAttachment.txt")));
+		
+		filter.filterConsumer(exchange, message);
+		
+		Assertions.assertThat(message.getAttachments()).isNotNull().isNotEmpty();
+		Assertions.assertThat(message.getAttachment("testAttachment")).isNotNull();
+	}
+}

Added: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/EmptyMessageFilter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/EmptyMessageFilter.java?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/EmptyMessageFilter.java (added)
+++ camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/EmptyMessageFilter.java Tue Nov 20 14:41:43 2012
@@ -0,0 +1,23 @@
+package org.apache.camel.component.spring.ws.testfilters;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.spring.ws.filter.MessageFilter;
+import org.springframework.ws.WebServiceMessage;
+
+public class EmptyMessageFilter implements MessageFilter {
+
+	@Override
+	public void filterProducer(Exchange exchange,
+			WebServiceMessage produceResponse) {
+		// Do nothing
+
+	}
+
+	@Override
+	public void filterConsumer(Exchange exchange,
+			WebServiceMessage consumerResponse) {
+		// Do nothing
+
+	}
+
+}

Added: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/GlobalMessageFilter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/GlobalMessageFilter.java?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/GlobalMessageFilter.java (added)
+++ camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/GlobalMessageFilter.java Tue Nov 20 14:41:43 2012
@@ -0,0 +1,23 @@
+package org.apache.camel.component.spring.ws.testfilters;
+
+import javax.xml.namespace.QName;
+
+import org.apache.camel.Message;
+import org.apache.camel.component.spring.ws.filter.impl.BasicMessageFilter;
+import org.springframework.ws.soap.SoapMessage;
+
+public class GlobalMessageFilter extends BasicMessageFilter {
+
+	/**
+	 * Add a test marker so the test method is aware which filter we are using.
+	 */
+	@Override
+	protected void doProcessSoapAttachments(Message inOrOut,
+			SoapMessage response) {
+		super.doProcessSoapAttachments(inOrOut, response);
+		response.getEnvelope()
+				.getHeader()
+				.addHeaderElement(
+						new QName("http://virtualCheck/", "globalFilter"));
+	}
+}

Added: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/LocalMessageFilter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/LocalMessageFilter.java?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/LocalMessageFilter.java (added)
+++ camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/testfilters/LocalMessageFilter.java Tue Nov 20 14:41:43 2012
@@ -0,0 +1,24 @@
+package org.apache.camel.component.spring.ws.testfilters;
+
+import javax.xml.namespace.QName;
+
+import org.apache.camel.Message;
+import org.apache.camel.component.spring.ws.filter.impl.BasicMessageFilter;
+import org.springframework.ws.soap.SoapMessage;
+
+public class LocalMessageFilter extends BasicMessageFilter {
+
+	/**
+	 * Add a test marker so the test method is aware which filter we are using.
+	 */
+	@Override
+	protected void doProcessSoapAttachments(Message inOrOut,
+			SoapMessage response) {
+		super.doProcessSoapAttachments(inOrOut, response);
+		response.getEnvelope()
+				.getHeader()
+				.addHeaderElement(
+						new QName("http://virtualCheck/", "localFilter"));
+	}
+
+}

Added: camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/DefaultMessageFilter-context.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/DefaultMessageFilter-context.xml?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/DefaultMessageFilter-context.xml (added)
+++ camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/DefaultMessageFilter-context.xml Tue Nov 20 14:41:43 2012
@@ -0,0 +1,66 @@
+<?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">
+
+	<!-- === Custom Spring-WS Camel Message Filtering ==== -->
+	<bean id="global"
+		class="org.apache.camel.component.spring.ws.testfilters.GlobalMessageFilter"></bean>
+
+	<bean id="local"
+		class="org.apache.camel.component.spring.ws.testfilters.LocalMessageFilter"></bean>
+
+	<bean id="empty"
+		class="org.apache.camel.component.spring.ws.testfilters.EmptyMessageFilter"></bean>
+
+
+	<camelContext xmlns="http://camel.apache.org/schema/spring">
+		<!-- consumer route (providing the actual web service) -->
+		<route>
+			<from uri="direct:sendWithGlobalFilter" />
+			<to
+				uri="spring-ws:http://localhost/testSender?endpointMapping=#endpointMapping&amp;webServiceTemplate=#webServiceTemplate" />
+		</route>
+		<route>
+			<from uri="direct:sendWithLocalFilter" />
+			<to
+				uri="spring-ws:http://localhost/testSender?endpointMapping=#endpointMapping&amp;messageFilter=local&amp;webServiceTemplate=#webServiceTemplate" />
+		</route>
+		<route>
+			<from uri="direct:sendWithoutFilter" />
+			<to
+				uri="spring-ws:http://localhost/testSender?endpointMapping=#endpointMapping&amp;messageFilter=empty&amp;webServiceTemplate=#webServiceTemplate" />
+		</route>
+		<route>
+			<from uri="direct:sendDefault" />
+			<to
+				uri="spring-ws:http://localhost/testSender?endpointMapping=#endpointMapping&amp;webServiceTemplate=#webServiceTemplate" />
+		</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="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

Added: camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/MessageFilter-context.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/MessageFilter-context.xml?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/MessageFilter-context.xml (added)
+++ camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/MessageFilter-context.xml Tue Nov 20 14:41:43 2012
@@ -0,0 +1,61 @@
+<?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">
+
+	<!-- === Custom Spring-WS Camel Message Filtering ==== -->
+	<bean id="messageFilter"
+		class="org.apache.camel.component.spring.ws.testfilters.GlobalMessageFilter"></bean>
+
+	<bean id="local"
+		class="org.apache.camel.component.spring.ws.testfilters.LocalMessageFilter"></bean>
+
+	<bean id="empty"
+		class="org.apache.camel.component.spring.ws.testfilters.EmptyMessageFilter"></bean>
+
+
+	<camelContext xmlns="http://camel.apache.org/schema/spring">
+		<!-- consumer route (providing the actual web service) -->
+		<route>
+			<from uri="direct:sendWithGlobalFilter" />
+			<to
+				uri="spring-ws:http://localhost/testSender?endpointMapping=#endpointMapping&amp;webServiceTemplate=#webServiceTemplate" />
+		</route>
+		<route>
+			<from uri="direct:sendWithLocalFilter" />
+			<to
+				uri="spring-ws:http://localhost/testSender?endpointMapping=#endpointMapping&amp;messageFilter=local&amp;webServiceTemplate=#webServiceTemplate" />
+		</route>
+		<route>
+			<from uri="direct:sendWithoutFilter" />
+			<to
+				uri="spring-ws:http://localhost/testSender?endpointMapping=#endpointMapping&amp;messageFilter=empty&amp;webServiceTemplate=#webServiceTemplate" />
+		</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="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

Added: camel/trunk/components/camel-spring-ws/src/test/resources/sampleAttachment.txt
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/resources/sampleAttachment.txt?rev=1411686&view=auto
==============================================================================
--- camel/trunk/components/camel-spring-ws/src/test/resources/sampleAttachment.txt (added)
+++ camel/trunk/components/camel-spring-ws/src/test/resources/sampleAttachment.txt Tue Nov 20 14:41:43 2012
@@ -0,0 +1 @@
+Sample Attachment File
\ No newline at end of file