Author: dvaleri Date: Mon Apr 16 19:03:24 2012 New Revision: 1326746 URL: http://svn.apache.org/viewvc?rev=1326746&view=rev Log: [CAMEL-4279] [CAMEL-4998] Added support to Spring WS Producer for JSSE Configuration Util and refactored risky code for setting connection timeout.
Added: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java (with props) camel/trunk/components/camel-spring-ws/src/test/resources/localhost.ks camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest-context.xml (with props) Modified: camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceConfiguration.java camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/ProducerRemoteRouteTimeOutTest.java 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=1326746&r1=1326745&r2=1326746&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 Mon Apr 16 19:03:24 2012 @@ -23,10 +23,11 @@ import org.apache.camel.component.spring import org.apache.camel.component.spring.ws.bean.CamelEndpointMapping; import org.apache.camel.component.spring.ws.type.EndpointMappingKey; import org.apache.camel.converter.jaxp.XmlConverter; +import org.apache.camel.util.jsse.SSLContextParameters; import org.springframework.ws.client.core.WebServiceTemplate; public class SpringWebserviceConfiguration { - + /* Producer configuration */ private WebServiceTemplate webServiceTemplate; private String soapAction; @@ -37,9 +38,10 @@ public class SpringWebserviceConfigurati private CamelEndpointMapping endpointMapping; private CamelEndpointDispatcher endpointDispatcher; private EndpointMappingKey endpointMappingKey; + private SSLContextParameters sslContextParameters; private XmlConverter xmlConverter; - + public WebServiceTemplate getWebServiceTemplate() { return webServiceTemplate; } @@ -101,6 +103,14 @@ public class SpringWebserviceConfigurati public void setEndpointMappingKey(EndpointMappingKey endpointMappingKey) { this.endpointMappingKey = endpointMappingKey; } + + public SSLContextParameters getSslContextParameters() { + return sslContextParameters; + } + + public void setSslContextParameters(SSLContextParameters sslContextParameters) { + this.sslContextParameters = sslContextParameters; + } public CamelEndpointDispatcher getEndpointDispatcher() { return endpointDispatcher; Modified: camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java?rev=1326746&r1=1326745&r2=1326746&view=diff ============================================================================== --- camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java (original) +++ camel/trunk/components/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java Mon Apr 16 19:03:24 2012 @@ -17,24 +17,21 @@ package org.apache.camel.component.spring.ws; import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.net.HttpURLConnection; import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.security.GeneralSecurityException; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; +import org.apache.camel.RuntimeCamelException; import org.apache.camel.TypeConverter; import org.apache.camel.impl.DefaultProducer; import org.apache.camel.util.ExchangeHelper; -import org.apache.camel.util.ReflectionHelper; -import org.apache.camel.util.ReflectionHelper.FieldCallback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,10 +42,12 @@ import org.springframework.ws.client.cor import org.springframework.ws.client.core.WebServiceTemplate; import org.springframework.ws.soap.addressing.client.ActionCallback; import org.springframework.ws.soap.client.core.SoapActionCallback; +import org.springframework.ws.transport.WebServiceConnection; import org.springframework.ws.transport.WebServiceMessageSender; +import org.springframework.ws.transport.http.AbstractHttpWebServiceMessageSender; import org.springframework.ws.transport.http.CommonsHttpMessageSender; +import org.springframework.ws.transport.http.HttpUrlConnection; import org.springframework.ws.transport.http.HttpUrlConnectionMessageSender; -import org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender; public class SpringWebserviceProducer extends DefaultProducer { @@ -74,7 +73,7 @@ public class SpringWebserviceProducer ex URI wsAddressingAction = exchange.getIn().getHeader(SpringWebserviceConstants.SPRING_WS_ADDRESSING_ACTION, URI.class); // Populate the given (read) timeout if any - populateTimeout(getEndpoint().getConfiguration()); + prepareMessageSenders(getEndpoint().getConfiguration()); WebServiceMessageCallback callback = new DefaultWebserviceMessageCallback(soapAction, wsAddressingAction, getEndpoint().getConfiguration()); Object body = null; @@ -89,104 +88,103 @@ public class SpringWebserviceProducer ex } } - private static void populateTimeout(SpringWebserviceConfiguration configuration) throws Exception { - if (!(configuration.getTimeout() > -1)) { + private static void prepareMessageSenders(SpringWebserviceConfiguration configuration) throws Exception { + // Skip this whole thing if none of the relevant config options are set. + if (!(configuration.getTimeout() > -1) && configuration.getSslContextParameters() == null) { return; } WebServiceTemplate webServiceTemplate = configuration.getWebServiceTemplate(); - // Can't use java.util.Arrays.asList() as it doesn't support the optional remove() operation which we need here - List<WebServiceMessageSender> webServiceMessageSenders = new ArrayList<WebServiceMessageSender>(webServiceTemplate.getMessageSenders().length); - Collections.addAll(webServiceMessageSenders, webServiceTemplate.getMessageSenders()); - for (WebServiceMessageSender webServiceMessageSender : webServiceMessageSenders) { - if (webServiceMessageSender instanceof CommonsHttpMessageSender) { - setTimeOut((CommonsHttpMessageSender) webServiceMessageSender, configuration); - } else if (webServiceMessageSender instanceof HttpsUrlConnectionMessageSender) { - // Should check HttpsUrlConnectionMessageSender beforehand as it extends HttpUrlConnectionMessageSender - webServiceMessageSenders.remove(webServiceMessageSender); - webServiceMessageSenders.add(new CamelHttpsUrlConnectionMessageSender(configuration, (HttpsUrlConnectionMessageSender) webServiceMessageSender)); - } else if (webServiceMessageSender instanceof HttpUrlConnectionMessageSender) { - webServiceMessageSenders.remove(webServiceMessageSender); - webServiceMessageSenders.add(new CamelHttpUrlConnectionMessageSender(configuration, (HttpUrlConnectionMessageSender) webServiceMessageSender)); + WebServiceMessageSender[] messageSenders = webServiceTemplate.getMessageSenders(); + + for (int i = 0; i < messageSenders.length; i++) { + WebServiceMessageSender messageSender = messageSenders[i]; + if (messageSender instanceof CommonsHttpMessageSender) { + if (configuration.getSslContextParameters() != null) { + LOG.warn("Not applying SSLContextParameters based configuration to CommonsHttpMessageSender. " + + "If you are using this MessageSender, which you are not by default, you will need " + + "to configure SSL using the Commons HTTP 3.x Protocol registry."); + } + + if (configuration.getTimeout() > -1) { + ((CommonsHttpMessageSender)messageSender).setReadTimeout(configuration.getTimeout()); + } + } else if (messageSender.getClass().equals(HttpUrlConnectionMessageSender.class)) { + // Only if exact match denoting likely use of default configuration. We don't want to get + // sub-classes that might have been otherwise injected. + messageSenders[i] = new AbstractHttpWebServiceMessageSenderDecorator((HttpUrlConnectionMessageSender)messageSender, configuration); } else { // For example this will be the case during unit-testing with the net.javacrumbs.spring-ws-test API - LOG.warn("Ignoring the timeout option for {} as there's no provided API available to populate it!", webServiceMessageSender); + LOG.warn("Ignoring the timeout and SSLContextParameters options for {}. You will need to configure " + + "these options directly on your custom configured WebServiceMessageSender", messageSender); } } - - webServiceTemplate.setMessageSenders(webServiceMessageSenders.toArray(new WebServiceMessageSender[webServiceMessageSenders.size()])); - } - - private static void setTimeOut(HttpURLConnection connection, SpringWebserviceConfiguration configuration) { - connection.setReadTimeout(configuration.getTimeout()); } - - private static void setTimeOut(CommonsHttpMessageSender commonsHttpMessageSender, SpringWebserviceConfiguration configuration) { - commonsHttpMessageSender.setReadTimeout(configuration.getTimeout()); - } - - protected static class CamelHttpUrlConnectionMessageSender extends HttpUrlConnectionMessageSender { - + + /** + * A decorator of {@link HttpUrlConnectionMessageSender} instances that can apply configuration options + * from the Camel component/endpoint configuration without replacing the actual implementation which may + * actually be an end-user implementation and not one of the built-in implementations. + */ + protected static final class AbstractHttpWebServiceMessageSenderDecorator extends AbstractHttpWebServiceMessageSender { + + private final AbstractHttpWebServiceMessageSender delegate; + private final SpringWebserviceConfiguration configuration; - - CamelHttpUrlConnectionMessageSender(SpringWebserviceConfiguration configuration, HttpUrlConnectionMessageSender webServiceMessageSender) { + + private SSLContext sslContext; + + public AbstractHttpWebServiceMessageSenderDecorator(AbstractHttpWebServiceMessageSender delegate, SpringWebserviceConfiguration configuration) { + this.delegate = delegate; this.configuration = configuration; - - // Populate the single acceptGzipEncoding property - setAcceptGzipEncoding(webServiceMessageSender.isAcceptGzipEncoding()); } @Override - protected void prepareConnection(HttpURLConnection connection) throws IOException { - super.prepareConnection(connection); - - setTimeOut(connection, configuration); - } - - } - - protected static class CamelHttpsUrlConnectionMessageSender extends HttpsUrlConnectionMessageSender { - - private final SpringWebserviceConfiguration configuration; - - CamelHttpsUrlConnectionMessageSender(SpringWebserviceConfiguration configuration, final HttpsUrlConnectionMessageSender webServiceMessageSender) throws Exception { - this.configuration = configuration; - - // Populate the single acceptGzipEncoding property beforehand as we have got a proper set/is API for it - setAcceptGzipEncoding(webServiceMessageSender.isAcceptGzipEncoding()); - - // Populate the fields not having getXXX available on HttpsUrlConnectionMessageSender - ReflectionHelper.doWithFields(HttpsUrlConnectionMessageSender.class, new FieldCallback() { - - @Override - public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { - if (Modifier.isStatic(field.getModifiers())) { - return; - } - - String fieldName = field.getName(); - if ("logger".equals(fieldName) || "acceptGzipEncoding".equals(fieldName)) { - // skip them - return; + public WebServiceConnection createConnection(URI uri) throws IOException { + WebServiceConnection wsc = delegate.createConnection(uri); + if (wsc instanceof HttpUrlConnection) { + HttpURLConnection connection = ((HttpUrlConnection)wsc).getConnection(); + + if (configuration.getTimeout() > -1) { + connection.setReadTimeout(configuration.getTimeout()); + } + + if (configuration.getSslContextParameters() != null && connection instanceof HttpsURLConnection) { + try { + synchronized (this) { + if (sslContext == null) { + sslContext = configuration.getSslContextParameters().createSSLContext(); + } + } + } catch (GeneralSecurityException e) { + throw new RuntimeCamelException("Error creating SSLContext based on SSLContextParameters.", e); } - - field.setAccessible(true); - Object value = field.get(webServiceMessageSender); - field.set(CamelHttpsUrlConnectionMessageSender.this, value); - LOG.trace("Populated the field {} with the value {}", fieldName, value); + + ((HttpsURLConnection) connection).setSSLSocketFactory(sslContext.getSocketFactory()); } - - }); + } else { + throw new RuntimeCamelException("Unsupported delegate. Delegate must return a org.springframework.ws.transport.http.HttpUrlConnection. Found " + + wsc.getClass()); + } + + return wsc; } @Override - protected void prepareConnection(HttpURLConnection connection) throws IOException { - super.prepareConnection(connection); + public boolean isAcceptGzipEncoding() { + return delegate.isAcceptGzipEncoding(); + } - setTimeOut(connection, configuration); + @Override + public void setAcceptGzipEncoding(boolean acceptGzipEncoding) { + delegate.setAcceptGzipEncoding(acceptGzipEncoding); } + @Override + public boolean supports(URI uri) { + return delegate.supports(uri); + } } protected static class DefaultWebserviceMessageCallback implements WebServiceMessageCallback { Modified: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/ProducerRemoteRouteTimeOutTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/ProducerRemoteRouteTimeOutTest.java?rev=1326746&r1=1326745&r2=1326746&view=diff ============================================================================== --- camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/ProducerRemoteRouteTimeOutTest.java (original) +++ camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/ProducerRemoteRouteTimeOutTest.java Mon Apr 16 19:03:24 2012 @@ -16,33 +16,19 @@ */ package org.apache.camel.component.spring.ws; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.net.SocketTimeoutException; -import java.security.SecureRandom; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.KeyManager; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; import org.apache.camel.CamelExecutionException; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; -import org.apache.camel.component.spring.ws.SpringWebserviceProducer.CamelHttpUrlConnectionMessageSender; -import org.apache.camel.component.spring.ws.SpringWebserviceProducer.CamelHttpsUrlConnectionMessageSender; import org.junit.Ignore; import org.junit.Test; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; -import org.springframework.ws.transport.http.HttpUrlConnectionMessageSender; -import org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -107,53 +93,4 @@ public class ProducerRemoteRouteTimeOutT return hasThrowableInChain(throwable.getCause(), clazz); } - - @Test - public void verifyTheFieldPopulationFromHttpUrlConnectionMessageSenderToCamelHttpUrlConnectionMessageSender() throws Exception { - HttpUrlConnectionMessageSender fromMessageSender = new HttpUrlConnectionMessageSender(); - fromMessageSender.setAcceptGzipEncoding(false); - - CamelHttpUrlConnectionMessageSender toMessageSender = new CamelHttpUrlConnectionMessageSender(new SpringWebserviceConfiguration(), fromMessageSender); - assertFalse("acceptGzipEncoding property didn't get populated properly!", toMessageSender.isAcceptGzipEncoding()); - - fromMessageSender.setAcceptGzipEncoding(true); - toMessageSender = new CamelHttpUrlConnectionMessageSender(new SpringWebserviceConfiguration(), fromMessageSender); - assertTrue("acceptGzipEncoding property didn't get populated properly!", toMessageSender.isAcceptGzipEncoding()); - } - - @Test - public void verifyTheFieldPopulationFromHttpsUrlConnectionMessageSenderToCamelHttpsUrlConnectionMessageSender() throws Exception { - HttpsUrlConnectionMessageSender fromMessageSender = new HttpsUrlConnectionMessageSender(); - fromMessageSender.setAcceptGzipEncoding(false); - fromMessageSender.setHostnameVerifier(new HostnameVerifier() { - - @Override - public boolean verify(String s, SSLSession sslsession) { - return false; - } - - }); - fromMessageSender.setKeyManagers(new KeyManager[] {new KeyManager() { - }}); - fromMessageSender.setSecureRandom(new SecureRandom()); - fromMessageSender.setSslProtocol("sslProtocol"); - fromMessageSender.setSslProvider("sslProvider"); - fromMessageSender.setTrustManagers(new TrustManager[] {new TrustManager() { - }}); - - CamelHttpsUrlConnectionMessageSender toMessageSender = new CamelHttpsUrlConnectionMessageSender(new SpringWebserviceConfiguration(), fromMessageSender); - - assertFalse("acceptGzipEncoding field didn't get populated properly!", toMessageSender.isAcceptGzipEncoding()); - for (Field field : fromMessageSender.getClass().getDeclaredFields()) { - if (Modifier.isStatic(field.getModifiers())) { - continue; - } - - field.setAccessible(true); - String fieldName = field.getName(); - - assertSame("The field '" + fieldName + "' didn't get populated properly!", field.get(fromMessageSender), field.get(toMessageSender)); - } - } - } Added: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java?rev=1326746&view=auto ============================================================================== --- camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java (added) +++ camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java Mon Apr 16 19:03:24 2012 @@ -0,0 +1,110 @@ +/** + * 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.annotation.Resource; +import javax.xml.transform.Source; + +import org.apache.camel.EndpointInject; +import org.apache.camel.Produce; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.StringSource; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +@ContextConfiguration +public class SSLContextParametersLocalRouteTest extends AbstractJUnit4SpringContextTests { + + private final String stockQuoteWebserviceUri = "https://localhost"; + private final String xmlRequestForGoogleStockQuote = "<GetQuote xmlns=\"http://www.webserviceX.NET/\"><symbol>GOOG</symbol></GetQuote>"; + + @Produce + private ProducerTemplate template; + + @EndpointInject(uri = "mock:result") + private MockEndpoint resultEndpoint; + + @Resource + private int port; + + @Test + public void consumeStockQuoteWebserviceWithDefaultTemplate() throws Exception { + Object result = template.requestBody("direct:stockQuoteWebserviceWithDefaultTemplate", xmlRequestForGoogleStockQuote); + + assertNotNull(result); + assertTrue(result instanceof Source); + } + + @Test + public void consumeStockQuoteWebserviceAndPreserveHeaders() throws Exception { + resultEndpoint.expectedHeaderReceived("helloHeader", "hello world!"); + + Object result = template.requestBodyAndHeader("direct:stockQuoteWebserviceMock", xmlRequestForGoogleStockQuote, "helloHeader", "hello world!"); + + assertNotNull(result); + resultEndpoint.assertIsSatisfied(); + } + + @Test + public void consumeStockQuoteWebservice() throws Exception { + Object result = template.requestBody("direct:stockQuoteWebservice", xmlRequestForGoogleStockQuote); + + assertNotNull(result); + assertTrue(result instanceof Source); + } + + @Test + public void consumeStockQuoteWebserviceWithCamelStringSourceInput() throws Exception { + Object result = template.requestBody("direct:stockQuoteWebservice", new StringSource(xmlRequestForGoogleStockQuote)); + + assertNotNull(result); + assertTrue(result instanceof Source); + } + + @Test + public void consumeStockQuoteWebserviceWithNonDefaultMessageFactory() throws Exception { + Object result = template.requestBody("direct:stockQuoteWebserviceWithNonDefaultMessageFactory", xmlRequestForGoogleStockQuote); + + assertNotNull(result); + assertTrue(result instanceof Source); + } + + @Test + public void consumeStockQuoteWebserviceAndConvertResult() throws Exception { + Object result = template.requestBody("direct:stockQuoteWebserviceAsString", xmlRequestForGoogleStockQuote); + + assertNotNull(result); + assertTrue(result instanceof String); + String resultMessage = (String) result; + assertTrue(resultMessage.contains("Google Inc.")); + } + + @Test + public void consumeStockQuoteWebserviceAndProvideEndpointUriByHeader() throws Exception { + Object result = template.requestBodyAndHeader("direct:stockQuoteWebserviceWithoutDefaultUri", xmlRequestForGoogleStockQuote, + SpringWebserviceConstants.SPRING_WS_ENDPOINT_URI, stockQuoteWebserviceUri + ":" + port); + + assertNotNull(result); + assertTrue(result instanceof String); + String resultMessage = (String) result; + assertTrue(resultMessage.contains("Google Inc.")); + } +} Propchange: camel/trunk/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: camel/trunk/components/camel-spring-ws/src/test/resources/localhost.ks URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/resources/localhost.ks?rev=1326746&view=auto ============================================================================== Files camel/trunk/components/camel-spring-ws/src/test/resources/localhost.ks (added) and camel/trunk/components/camel-spring-ws/src/test/resources/localhost.ks Mon Apr 16 19:03:24 2012 differ Added: camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest-context.xml URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest-context.xml?rev=1326746&view=auto ============================================================================== --- camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest-context.xml (added) +++ camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest-context.xml Mon Apr 16 19:03:24 2012 @@ -0,0 +1,139 @@ +<?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"> + + + <bean id="port" + class="org.apache.camel.test.AvailablePortFinder" + factory-method="getNextAvailable"/> + + <camelContext xmlns="http://camel.apache.org/schema/spring"> + <!-- producer routes (web service clients) --> + <route> + <from uri="direct:stockQuoteWebservice"/> + <to uri="spring-ws:https://localhost:#{port}?webServiceTemplate=#webServiceTemplate&soapAction=http://www.stockquotes.edu/GetQuote&sslContextParameters=#sslContextParameters"/> + </route> + <route> + <from uri="direct:stockQuoteWebserviceMock"/> + <pipeline> + <to uri="spring-ws:https://localhost:#{port}?webServiceTemplate=#webServiceTemplate&soapAction=http://www.stockquotes.edu/GetQuote&sslContextParameters=#sslContextParameters"/> + <to uri="mock:result" /> + </pipeline> + </route> + <route> + <from uri="direct:stockQuoteWebserviceAsString"/> + <to uri="spring-ws:https://localhost:#{port}?webServiceTemplate=#webServiceTemplate&soapAction=http://www.stockquotes.edu/GetQuote&sslContextParameters=#sslContextParameters"/> + <convertBodyTo type="java.lang.String"/> + </route> + <route> + <from uri="direct:stockQuoteWebserviceWithDefaultTemplate"/> + <to uri="spring-ws:https://localhost:#{port}?webServiceTemplate=#webServiceTemplate&soapAction=http://www.stockquotes.edu/GetQuote&sslContextParameters=#sslContextParameters"/> + </route> + <route> + <from uri="direct:stockQuoteWebserviceWithNonDefaultMessageFactory"/> + <to uri="spring-ws:https://localhost:#{port}?webServiceTemplate=#webServiceTemplate&soapAction=http://www.stockquotes.edu/GetQuote&messageFactory=#messageFactory&sslContextParameters=#sslContextParameters"/> + </route> + <route> + <from uri="direct:stockQuoteWebserviceWithoutDefaultUri"/> + <to uri="spring-ws:https://dummy?webServiceTemplate=#webServiceTemplate&soapAction=http://www.stockquotes.edu/GetQuote&sslContextParameters=#sslContextParameters"/> + <convertBodyTo type="java.lang.String"/> + </route> + <!-- consumer route (providing the actual web service) --> + <route> + <from uri="spring-ws:soapaction:http://www.stockquotes.edu/GetQuote?endpointMapping=#endpointMapping"/> + <to uri="responseProcessor"/> + </route> + </camelContext> + + <sslContextParameters xmlns="http://camel.apache.org/schema/spring" + id="sslContextParameters" + sessionTimeout="1" + secureSocketProtocol="TLS"> + + <keyManagers + keyPassword="changeit"> + <keyStore + resource="localhost.ks" + password="changeit"/> + </keyManagers> + + <trustManagers> + <keyStore + resource="localhost.ks" + password="changeit"/> + </trustManagers> + + </sslContextParameters> + + <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.StockQuoteResponseProcessor"/> + + <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> + <property name="defaultUri" value="https://localhost:#{port}/GetQuote"/> + </bean> + + <bean id="httpServer" class="sun.net.httpserver.HttpsServerImpl" init-method="start"> + <constructor-arg> + <bean class="java.net.InetSocketAddress"> + <constructor-arg value="localhost"/> + <constructor-arg ref="port"/> + </bean> + </constructor-arg> + <constructor-arg value="0"/> + <property name="httpsConfigurator"> + <bean class="com.sun.net.httpserver.HttpsConfigurator"> + <constructor-arg> + <bean factory-bean="sslContextParameters" factory-method="createSSLContext"/> + </constructor-arg> + </bean> + </property> + </bean> + + <bean id="httpContext" + class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> + <property name="targetObject" ref="httpServer" /> + <property name="targetMethod" value="createContext" /> + <property name="arguments"> + <array> + <value>/</value> + <bean class="org.springframework.ws.transport.http.WebServiceMessageReceiverHttpHandler"> + <property name="messageFactory" ref="messageFactory"/> + <property name="messageReceiver"> + <bean class="org.springframework.ws.soap.server.SoapMessageDispatcher"> + <property name="endpointMappings"> + <list> + <ref bean="endpointMapping"/> + </list> + </property> + </bean> + </property> + </bean> + </array> + </property> + </bean> + +</beans> \ No newline at end of file Propchange: camel/trunk/components/camel-spring-ws/src/test/resources/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest-context.xml ------------------------------------------------------------------------------ svn:eol-style = native