Repository: camel Updated Branches: refs/heads/master 7c3beb5dc -> 3cc803a1a
CAMEL-9046: Implement Camel SSL-Context for cxfrs Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/3cc803a1 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3cc803a1 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3cc803a1 Branch: refs/heads/master Commit: 3cc803a1a9d26caacec07059c3ecd0e7e7a0e626 Parents: 7c3beb5 Author: Arno Noordover <anoordo...@users.noreply.github.com> Authored: Sat May 28 22:33:51 2016 +0200 Committer: Arno Noordover <anoordo...@users.noreply.github.com> Committed: Sat May 28 22:33:51 2016 +0200 ---------------------------------------------------------------------- .../apache/camel/component/cxf/CxfEndpoint.java | 11 +- .../HostnameVerifierCxfEndpointConfigurer.java | 19 +--- .../component/cxf/SslCxfEndpointConfigurer.java | 33 +----- ...tractHostnameVerifierEndpointConfigurer.java | 36 +++++++ .../common/AbstractSslEndpointConfigurer.java | 51 +++++++++ .../AbstractTLSClientParameterConfigurer.java | 30 ++++++ .../jaxrs/ChainedCxfRsEndpointConfigurer.java | 77 ++++++++++++++ .../component/cxf/jaxrs/CxfRsEndpoint.java | 59 +++++++++++ .../cxf/jaxrs/CxfRsEndpointConfigurer.java | 48 +++++++++ .../component/cxf/jaxrs/CxfRsProducer.java | 1 + ...HostnameVerifierCxfRsEndpointConfigurer.java | 54 ++++++++++ .../cxf/jaxrs/SslCxfRsEndpointConfigurer.java | 56 ++++++++++ .../camel/component/cxf/CXFTestSupport.java | 4 + .../cxf/jaxrs/CxfRsSslProducerTest.java | 105 +++++++++++++++++++ .../cxf/jaxrs/CxfRsSpringSslProducer.xml | 96 +++++++++++++++++ 15 files changed, 629 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java index 88f32ae..853a6e2 100644 --- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java @@ -378,9 +378,7 @@ public class CxfEndpoint extends DefaultEndpoint implements AsyncEndpoint, Heade sfb.setBus(getBus()); sfb.setStart(false); - if (getCxfEndpointConfigurer() != null) { - getCxfEndpointConfigurer().configure(sfb); - } + getNullSafeCxfEndpointConfigurer().configure(sfb); } /** @@ -575,9 +573,8 @@ public class CxfEndpoint extends DefaultEndpoint implements AsyncEndpoint, Heade } factoryBean.setBus(getBus()); - if (getCxfEndpointConfigurer() != null) { - getCxfEndpointConfigurer().configure(factoryBean); - } + + getNullSafeCxfEndpointConfigurer().configure(factoryBean); } // Package private methods @@ -1234,7 +1231,7 @@ public class CxfEndpoint extends DefaultEndpoint implements AsyncEndpoint, Heade if (nd instanceof Document) { nd = ((Document)nd).getDocumentElement(); } - return ((Element)nd).getLocalName(); + return nd.getLocalName(); } else if (source instanceof StaxSource) { StaxSource s = (StaxSource)source; r = s.getXMLStreamReader(); http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HostnameVerifierCxfEndpointConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HostnameVerifierCxfEndpointConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HostnameVerifierCxfEndpointConfigurer.java index 913ce59..bf13c72 100644 --- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HostnameVerifierCxfEndpointConfigurer.java +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HostnameVerifierCxfEndpointConfigurer.java @@ -18,18 +18,16 @@ package org.apache.camel.component.cxf; import javax.net.ssl.HostnameVerifier; -import org.apache.cxf.configuration.jsse.TLSClientParameters; +import org.apache.camel.component.cxf.common.AbstractHostnameVerifierEndpointConfigurer; import org.apache.cxf.endpoint.Client; import org.apache.cxf.endpoint.Server; import org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory; import org.apache.cxf.transport.http.HTTPConduit; -public final class HostnameVerifierCxfEndpointConfigurer implements CxfEndpointConfigurer { - - private final HostnameVerifier hostnameVerifier; +public final class HostnameVerifierCxfEndpointConfigurer extends AbstractHostnameVerifierEndpointConfigurer implements CxfEndpointConfigurer { private HostnameVerifierCxfEndpointConfigurer(HostnameVerifier hostnameVerifier) { - this.hostnameVerifier = hostnameVerifier; + super(hostnameVerifier); } public static CxfEndpointConfigurer create(HostnameVerifier hostnameVerifier) { @@ -46,16 +44,7 @@ public final class HostnameVerifierCxfEndpointConfigurer implements CxfEndpointC @Override public void configureClient(Client client) { HTTPConduit httpConduit = (HTTPConduit) client.getConduit(); - TLSClientParameters tlsClientParameters = tryToGetTLSClientParametersFromConduit(httpConduit); - tlsClientParameters.setHostnameVerifier(hostnameVerifier); - httpConduit.setTlsClientParameters(tlsClientParameters); - } - - private TLSClientParameters tryToGetTLSClientParametersFromConduit(HTTPConduit httpConduit) { - if (httpConduit.getTlsClientParameters() != null) { - return httpConduit.getTlsClientParameters(); - } - return new TLSClientParameters(); + setupHttpConduit(httpConduit); } @Override http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/SslCxfEndpointConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/SslCxfEndpointConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/SslCxfEndpointConfigurer.java index 2c19dcf..d16e139 100644 --- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/SslCxfEndpointConfigurer.java +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/SslCxfEndpointConfigurer.java @@ -16,26 +16,19 @@ */ package org.apache.camel.component.cxf; -import java.io.IOException; -import java.security.GeneralSecurityException; -import javax.net.ssl.SSLSocketFactory; - import org.apache.camel.CamelContext; +import org.apache.camel.component.cxf.common.AbstractSslEndpointConfigurer; import org.apache.camel.util.jsse.SSLContextParameters; -import org.apache.cxf.configuration.jsse.TLSClientParameters; import org.apache.cxf.endpoint.Client; import org.apache.cxf.endpoint.Server; import org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory; import org.apache.cxf.transport.http.HTTPConduit; -public final class SslCxfEndpointConfigurer implements CxfEndpointConfigurer { - private final SSLContextParameters sslContextParameters; - private final CamelContext camelContext; +public final class SslCxfEndpointConfigurer extends AbstractSslEndpointConfigurer implements CxfEndpointConfigurer { private SslCxfEndpointConfigurer(SSLContextParameters sslContextParameters, CamelContext camelContext) { - this.camelContext = camelContext; - this.sslContextParameters = sslContextParameters; + super(sslContextParameters, camelContext); } public static CxfEndpointConfigurer create(SSLContextParameters sslContextParameters, CamelContext camelContext) { @@ -53,25 +46,7 @@ public final class SslCxfEndpointConfigurer implements CxfEndpointConfigurer { @Override public void configureClient(Client client) { HTTPConduit httpConduit = (HTTPConduit) client.getConduit(); - TLSClientParameters tlsClientParameters = tryToGetTLSClientParametersFromConduit(httpConduit); - tlsClientParameters.setSSLSocketFactory(tryToGetSSLSocketFactory()); - httpConduit.setTlsClientParameters(tlsClientParameters); - } - - private TLSClientParameters tryToGetTLSClientParametersFromConduit(HTTPConduit httpConduit) { - if (httpConduit.getTlsClientParameters() != null) { - return httpConduit.getTlsClientParameters(); - } - return new TLSClientParameters(); - } - - private SSLSocketFactory tryToGetSSLSocketFactory() { - try { - return sslContextParameters.createSSLContext(camelContext) - .getSocketFactory(); - } catch (GeneralSecurityException | IOException e) { - throw new RuntimeException("Setting SSL failed", e); - } + setupHttpConduit(httpConduit); } @Override http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractHostnameVerifierEndpointConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractHostnameVerifierEndpointConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractHostnameVerifierEndpointConfigurer.java new file mode 100644 index 0000000..bbb9b30 --- /dev/null +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractHostnameVerifierEndpointConfigurer.java @@ -0,0 +1,36 @@ +/** + * 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.common; + +import javax.net.ssl.HostnameVerifier; + +import org.apache.cxf.configuration.jsse.TLSClientParameters; +import org.apache.cxf.transport.http.HTTPConduit; + +public class AbstractHostnameVerifierEndpointConfigurer extends AbstractTLSClientParameterConfigurer { + protected final HostnameVerifier hostnameVerifier; + + public AbstractHostnameVerifierEndpointConfigurer(HostnameVerifier hostnameVerifier) { + this.hostnameVerifier = hostnameVerifier; + } + + protected void setupHttpConduit(HTTPConduit httpConduit) { + TLSClientParameters tlsClientParameters = tryToGetTLSClientParametersFromConduit(httpConduit); + tlsClientParameters.setHostnameVerifier(hostnameVerifier); + httpConduit.setTlsClientParameters(tlsClientParameters); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractSslEndpointConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractSslEndpointConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractSslEndpointConfigurer.java new file mode 100644 index 0000000..b4dfb91 --- /dev/null +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractSslEndpointConfigurer.java @@ -0,0 +1,51 @@ +/** + * 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.common; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import javax.net.ssl.SSLSocketFactory; + +import org.apache.camel.CamelContext; +import org.apache.camel.util.jsse.SSLContextParameters; +import org.apache.cxf.configuration.jsse.TLSClientParameters; +import org.apache.cxf.transport.http.HTTPConduit; + +public class AbstractSslEndpointConfigurer extends AbstractTLSClientParameterConfigurer { + protected final SSLContextParameters sslContextParameters; + protected final CamelContext camelContext; + + public AbstractSslEndpointConfigurer(SSLContextParameters sslContextParameters, CamelContext camelContext) { + this.sslContextParameters = sslContextParameters; + this.camelContext = camelContext; + } + + protected void setupHttpConduit(HTTPConduit httpConduit) { + TLSClientParameters tlsClientParameters = tryToGetTLSClientParametersFromConduit(httpConduit); + tlsClientParameters.setSSLSocketFactory(tryToGetSSLSocketFactory()); + httpConduit.setTlsClientParameters(tlsClientParameters); + } + + private SSLSocketFactory tryToGetSSLSocketFactory() { + try { + return sslContextParameters.createSSLContext(camelContext) + .getSocketFactory(); + } catch (GeneralSecurityException | IOException e) { + throw new RuntimeException("Setting SSL failed", e); + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractTLSClientParameterConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractTLSClientParameterConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractTLSClientParameterConfigurer.java new file mode 100644 index 0000000..6957961 --- /dev/null +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/common/AbstractTLSClientParameterConfigurer.java @@ -0,0 +1,30 @@ +/** + * 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.common; + +import org.apache.cxf.configuration.jsse.TLSClientParameters; +import org.apache.cxf.transport.http.HTTPConduit; + +public class AbstractTLSClientParameterConfigurer { + + protected TLSClientParameters tryToGetTLSClientParametersFromConduit(HTTPConduit httpConduit) { + if (httpConduit.getTlsClientParameters() != null) { + return httpConduit.getTlsClientParameters(); + } + return new TLSClientParameters(); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/ChainedCxfRsEndpointConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/ChainedCxfRsEndpointConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/ChainedCxfRsEndpointConfigurer.java new file mode 100644 index 0000000..a9aeaf5 --- /dev/null +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/ChainedCxfRsEndpointConfigurer.java @@ -0,0 +1,77 @@ +/** + * 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.jaxrs; + +import org.apache.cxf.endpoint.Server; +import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean; +import org.apache.cxf.jaxrs.client.Client; + +public final class ChainedCxfRsEndpointConfigurer implements CxfRsEndpointConfigurer { + private CxfRsEndpointConfigurer parent; + private CxfRsEndpointConfigurer child; + + private ChainedCxfRsEndpointConfigurer() { + } + + public static ChainedCxfRsEndpointConfigurer create(CxfRsEndpointConfigurer parent, + CxfRsEndpointConfigurer child) { + ChainedCxfRsEndpointConfigurer result = new ChainedCxfRsEndpointConfigurer(); + result.parent = parent; + result.child = child; + return result; + } + + public ChainedCxfRsEndpointConfigurer addChild(CxfRsEndpointConfigurer cxfEndpointConfigurer) { + ChainedCxfRsEndpointConfigurer result = new ChainedCxfRsEndpointConfigurer(); + result.parent = this; + result.child = cxfEndpointConfigurer; + return result; + } + + @Override + public void configure(AbstractJAXRSFactoryBean factoryBean) { + parent.configure(factoryBean); + child.configure(factoryBean); + } + + @Override + public void configureClient(Client client) { + parent.configureClient(client); + child.configureClient(client); + } + + @Override + public void configureServer(Server server) { + parent.configureServer(server); + child.configureServer(server); + } + + public static class NullCxfRsEndpointConfigurer implements CxfRsEndpointConfigurer { + + @Override + public void configure(AbstractJAXRSFactoryBean factoryBean) { + } + + @Override + public void configureClient(Client client) { + } + + @Override + public void configureServer(Server server) { + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java index 96885ba..cb5dff4 100644 --- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpoint.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.net.ssl.HostnameVerifier; import org.apache.camel.CamelContext; import org.apache.camel.Component; @@ -39,6 +40,7 @@ import org.apache.camel.spi.UriParam; import org.apache.camel.spi.UriPath; import org.apache.camel.util.EndpointHelper; import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.jsse.SSLContextParameters; import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; import org.apache.cxf.common.util.ModCountCopyOnWriteArrayList; @@ -102,6 +104,10 @@ public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrate private boolean throwExceptionOnFailure = true; @UriParam(label = "producer,advanced", defaultValue = "10") private int maxClientCacheSize = 10; + @UriParam(label = "producer") + private SSLContextParameters sslContextParameters; + @UriParam(label = "producer") + private HostnameVerifier hostnameVerifier; @UriParam private boolean loggingFeatureEnabled; @UriParam @@ -116,6 +122,8 @@ public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrate private boolean performInvocation; @UriParam(label = "advanced") private boolean propagateContexts; + @UriParam(label = "advanced") + private CxfRsEndpointConfigurer cxfRsEndpointConfigurer; public CxfRsEndpoint() { } @@ -204,6 +212,12 @@ public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrate return skipFaultLogging; } + public CxfRsEndpointConfigurer getChainedCxfRsEndpointConfigurer() { + return ChainedCxfRsEndpointConfigurer + .create(getNullSafeCxfRsEndpointConfigurer(), + SslCxfRsEndpointConfigurer.create(sslContextParameters, getCamelContext())) + .addChild(HostnameVerifierCxfRsEndpointConfigurer.create(hostnameVerifier)); + } /** * This option controls whether the PhaseInterceptorChain skips logging the Fault that it catches. */ @@ -237,6 +251,14 @@ public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrate } setupCommonFactoryProperties(sfb); sfb.setStart(false); + getNullSafeCxfRsEndpointConfigurer().configure(sfb); + } + + private CxfRsEndpointConfigurer getNullSafeCxfRsEndpointConfigurer() { + if (cxfRsEndpointConfigurer == null) { + return new ChainedCxfRsEndpointConfigurer.NullCxfRsEndpointConfigurer(); + } + return cxfRsEndpointConfigurer; } private void processResourceModel(JAXRSServerFactoryBean sfb) { @@ -283,6 +305,7 @@ public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrate } setupCommonFactoryProperties(cfb); cfb.setThreadSafe(true); + getNullSafeCxfRsEndpointConfigurer().configure(cfb); } protected void setupCommonFactoryProperties(AbstractJAXRSFactoryBean factory) { @@ -724,4 +747,40 @@ public class CxfRsEndpoint extends DefaultEndpoint implements HeaderFilterStrate private static class InterceptorHolder extends AbstractBasicInterceptorProvider { } + public SSLContextParameters getSslContextParameters() { + return sslContextParameters; + } + + /** + * The Camel SSL setting reference. Use the # notation to reference the SSL Context. + */ + public void setSslContextParameters(SSLContextParameters sslContextParameters) { + this.sslContextParameters = sslContextParameters; + } + + public HostnameVerifier getHostnameVerifier() { + return hostnameVerifier; + } + + /** + * The hostname verifier to be used. Use the # notation to reference a HostnameVerifier + * from the registry. + */ + public void setHostnameVerifier(HostnameVerifier hostnameVerifier) { + this.hostnameVerifier = hostnameVerifier; + } + + public CxfRsEndpointConfigurer getCxfRsEndpointConfigurer() { + return cxfRsEndpointConfigurer; + } + + /** + * This option could apply the implementation of org.apache.camel.component.cxf.jaxrs.CxfRsEndpointConfigurer which supports to configure the CXF endpoint + * in programmatic way. User can configure the CXF server and client by implementing configure{Server/Client} method of CxfEndpointConfigurer. + */ + public void setCxfRsEndpointConfigurer(CxfRsEndpointConfigurer configurer) { + this.cxfRsEndpointConfigurer = configurer; + } + + } http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpointConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpointConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpointConfigurer.java new file mode 100644 index 0000000..bfa9929 --- /dev/null +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsEndpointConfigurer.java @@ -0,0 +1,48 @@ +/** + * 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.jaxrs; + +import org.apache.cxf.endpoint.Server; +import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean; +import org.apache.cxf.jaxrs.client.Client; + +/** + * A pluggable strategy for configuring the cxfRsEndpoint by using java code + */ +public interface CxfRsEndpointConfigurer { + + /** + * Configure the CXF-RS Server/Client factory bean + * @param factoryBean + */ + void configure(AbstractJAXRSFactoryBean factoryBean); + + /** + * Configure the CXF Client such as setting some parameters on the client conduit + * + * @param client the CXF client + */ + void configureClient(Client client); + + /** + * Configure the CXF Server such as setting some parameters on the server destination + * + * @param server the CXF server + */ + void configureServer(Server server); + +} http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java index 33045dd..afe20b4b 100644 --- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java @@ -161,6 +161,7 @@ public class CxfRsProducer extends DefaultProducer { cfb.setBus(bus); } WebClient client = cfb.createWebClient(); + ((CxfRsEndpoint) getEndpoint()).getChainedCxfRsEndpointConfigurer().configureClient(client); String httpMethod = inMessage.getHeader(Exchange.HTTP_METHOD, String.class); Class<?> responseClass = inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, Class.class); Type genericType = inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_GENERIC_TYPE, Type.class); http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/HostnameVerifierCxfRsEndpointConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/HostnameVerifierCxfRsEndpointConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/HostnameVerifierCxfRsEndpointConfigurer.java new file mode 100644 index 0000000..e702b6a --- /dev/null +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/HostnameVerifierCxfRsEndpointConfigurer.java @@ -0,0 +1,54 @@ +/** + * 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.jaxrs; + +import javax.net.ssl.HostnameVerifier; + +import org.apache.camel.component.cxf.common.AbstractHostnameVerifierEndpointConfigurer; +import org.apache.cxf.endpoint.Server; +import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean; +import org.apache.cxf.jaxrs.client.Client; +import org.apache.cxf.jaxrs.client.WebClient; +import org.apache.cxf.transport.http.HTTPConduit; + +public final class HostnameVerifierCxfRsEndpointConfigurer extends AbstractHostnameVerifierEndpointConfigurer implements CxfRsEndpointConfigurer { + + private HostnameVerifierCxfRsEndpointConfigurer(HostnameVerifier hostnameVerifier) { + super(hostnameVerifier); + } + + public static CxfRsEndpointConfigurer create(HostnameVerifier hostnameVerifier) { + if (hostnameVerifier == null) { + return new ChainedCxfRsEndpointConfigurer.NullCxfRsEndpointConfigurer(); + } else { + return new HostnameVerifierCxfRsEndpointConfigurer(hostnameVerifier); + } + } + @Override + public void configure(AbstractJAXRSFactoryBean factoryBean) { + } + + @Override + public void configureClient(Client client) { + HTTPConduit httpConduit = (HTTPConduit) WebClient.getConfig(client).getConduit(); + setupHttpConduit(httpConduit); + } + + @Override + public void configureServer(Server server) { + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/SslCxfRsEndpointConfigurer.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/SslCxfRsEndpointConfigurer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/SslCxfRsEndpointConfigurer.java new file mode 100644 index 0000000..5ef5cad --- /dev/null +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/SslCxfRsEndpointConfigurer.java @@ -0,0 +1,56 @@ +/** + * 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.jaxrs; + +import org.apache.camel.CamelContext; +import org.apache.camel.component.cxf.common.AbstractSslEndpointConfigurer; +import org.apache.camel.util.jsse.SSLContextParameters; +import org.apache.cxf.endpoint.Server; +import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean; +import org.apache.cxf.jaxrs.client.Client; +import org.apache.cxf.jaxrs.client.WebClient; +import org.apache.cxf.transport.http.HTTPConduit; + +public final class SslCxfRsEndpointConfigurer extends AbstractSslEndpointConfigurer implements CxfRsEndpointConfigurer { + + private SslCxfRsEndpointConfigurer(SSLContextParameters sslContextParameters, + CamelContext camelContext) { + super(sslContextParameters, camelContext); + } + + public static CxfRsEndpointConfigurer create(SSLContextParameters sslContextParameters, CamelContext camelContext) { + if (sslContextParameters == null) { + return new ChainedCxfRsEndpointConfigurer.NullCxfRsEndpointConfigurer(); + } else { + return new SslCxfRsEndpointConfigurer(sslContextParameters, camelContext); + } + } + + @Override + public void configure(AbstractJAXRSFactoryBean factoryBean) { + } + + @Override + public void configureClient(Client client) { + HTTPConduit httpConduit = (HTTPConduit) WebClient.getConfig(client).getConduit(); + setupHttpConduit(httpConduit); + } + + @Override + public void configureServer(Server server) { + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFTestSupport.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFTestSupport.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFTestSupport.java index a40c2d8..a310066 100644 --- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFTestSupport.java +++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFTestSupport.java @@ -79,4 +79,8 @@ public final class CXFTestSupport { public static int getPort6() { return PORT6; } + + public static int getSslPort() { + return SSL_PORT; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSslProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSslProducerTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSslProducerTest.java new file mode 100644 index 0000000..d79df80 --- /dev/null +++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsSslProducerTest.java @@ -0,0 +1,105 @@ +/** + * 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.jaxrs; + +import org.apache.camel.Exchange; +import org.apache.camel.ExchangePattern; +import org.apache.camel.Message; +import org.apache.camel.Processor; +import org.apache.camel.component.cxf.CXFTestSupport; +import org.apache.camel.component.cxf.common.message.CxfConstants; +import org.apache.camel.component.cxf.jaxrs.testbean.Customer; +import org.apache.camel.test.spring.CamelSpringTestSupport; +import org.junit.Test; +import org.springframework.context.support.AbstractXmlApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import static org.hamcrest.core.Is.is; + +public class CxfRsSslProducerTest extends CamelSpringTestSupport { + private static int port1 = CXFTestSupport.getSslPort(); + + @Override + public boolean isCreateCamelContextPerClass() { + return true; + } + + public int getPort1() { + return port1; + } + + @Override + protected AbstractXmlApplicationContext createApplicationContext() { + return new ClassPathXmlApplicationContext("org/apache/camel/component/cxf/jaxrs/CxfRsSpringSslProducer.xml"); + } + + protected void setupDestinationURL(Message inMessage) { + // do nothing here + } + + @Test + public void testCorrectTrustStore() { + Exchange exchange = template.send("direct://trust", new MyProcessor()); + + // get the response message + Customer response = (Customer) exchange.getOut().getBody(); + + assertNotNull("The response should not be null ", response); + assertEquals("Get a wrong customer id ", String.valueOf(response.getId()), "123"); + assertEquals("Get a wrong customer name", response.getName(), "John"); + assertEquals("Get a wrong response code", 200, exchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + assertEquals("Get a wrong header value", "value", exchange.getOut().getHeader("key")); + } + + @Test + public void testNoTrustStore() { + Exchange exchange = template.send("direct://noTrust", new MyProcessor()); + assertThat(exchange.isFailed(), is(true)); + Exception e = exchange.getException(); + assertThat(e.getCause().getClass().getCanonicalName(), is("javax.net.ssl.SSLHandshakeException")); + } + + @Test + public void testWrongTrustStore() { + Exchange exchange = template.send("direct://wrongTrust", new MyProcessor()); + assertThat(exchange.isFailed(), is(true)); + Exception e = exchange.getException(); + assertThat(e.getCause().getClass().getCanonicalName(), is("javax.net.ssl.SSLHandshakeException")); + } + + private class MyProcessor implements Processor { + + @Override + public void process(Exchange exchange) throws Exception { + exchange.setPattern(ExchangePattern.InOut); + Message inMessage = exchange.getIn(); + setupDestinationURL(inMessage); + // using the http central client API + inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, Boolean.TRUE); + // set the Http method + inMessage.setHeader(Exchange.HTTP_METHOD, "GET"); + // set the relative path + inMessage.setHeader(Exchange.HTTP_PATH, "/customerservice/customers/123"); + // Specify the response class , cxfrs will use InputStream as the response object type + inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, Customer.class); + // set a customer header + inMessage.setHeader("key", "value"); + // since we use the Get method, so we don't need to set the message body + inMessage.setBody(null); + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/3cc803a1/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringSslProducer.xml ---------------------------------------------------------------------- diff --git a/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringSslProducer.xml b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringSslProducer.xml new file mode 100644 index 0000000..06f17d8 --- /dev/null +++ b/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringSslProducer.xml @@ -0,0 +1,96 @@ +<?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" + xmlns:jaxrs="http://cxf.apache.org/jaxrs" + xmlns:util="http://www.springframework.org/schema/util" + xmlns:sec="http://cxf.apache.org/configuration/security" + xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd + http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd + http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd + http://cxf.apache.org/transports/http-jetty/configuration http://cxf.apache.org/schemas/configuration/http-jetty.xsd + "> + <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/> + + <import resource="classpath:META-INF/cxf/cxf.xml"/> + + <httpj:engine-factory bus="cxf"> + <!-- you just need to specify the TLS Server configuration for the certain port --> + <httpj:engine port="${CXFTestSupport.sslPort}"> + <httpj:tlsServerParameters> + <sec:keyManagers keyPassword="changeit"> + <sec:keyStore type="JKS" password="changeit" + resource="/ssl/keystore-server.jks"/> + </sec:keyManagers> + <sec:clientAuthentication want="false" required="false"/> + </httpj:tlsServerParameters> + </httpj:engine> + </httpj:engine-factory> + + <jaxrs:server id="restService" + address="https://localhost:${CXFTestSupport.sslPort}/CxfRsProducerTest/" + staticSubresourceResolution="true"> + <jaxrs:serviceBeans> + <ref bean="customerService"/> + </jaxrs:serviceBeans> + </jaxrs:server> + + <sslContextParameters xmlns="http://camel.apache.org/schema/spring" + id="wrongSslContext"> + <trustManagers> + <keyStore type="JKS" resource="/ssl/truststore-wrong.jks" + password="changeit"/> + </trustManagers> + </sslContextParameters> + <sslContextParameters xmlns="http://camel.apache.org/schema/spring" + id="mySslContext"> + <trustManagers> + <keyStore type="JKS" resource="/ssl/truststore-client.jks" + password="changeit"/> + </trustManagers> + </sslContextParameters> + + <bean id="defaultHostnameVerifier" + class="org.apache.cxf.transport.https.httpclient.DefaultHostnameVerifier"/> + + <bean id="customerService" class="org.apache.camel.component.cxf.jaxrs.testbean.CustomerService"/> + + <cxf:rsClient id="rsClientHttp" address="https://localhost:${CXFTestSupport.sslPort}/CxfRsProducerTest/"/> + + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + <route> + <from uri="direct://trust"/> + <to uri="cxfrs://bean://rsClientHttp?sslContextParameters=#mySslContext&hostnameVerifier=#defaultHostnameVerifier"/> + </route> + <route> + <from uri="direct://wrongTrust"/> + <to uri="cxfrs://bean://rsClientHttp?sslContextParameters=#wrongSslContext&hostnameVerifier=#defaultHostnameVerifier"/> + </route> + <route> + <from uri="direct://noTrust"/> + <to uri="cxfrs://bean://rsClientHttp?sslContextParameters=#wrongSslContext&hostnameVerifier=#defaultHostnameVerifier"/> + </route> + </camelContext> + +</beans>