CAMEL-9945 Upgrade to Jetty 9.3 In Jetty 9.3 API signature changed from: List<ProtocolHandler> getProtocolHandler() to: ProtocolHandlers getProtocolHandler()
This commit adds reflection bridge to keep the compatibility with Jetty 9.2 and Jetty 9.3. Tested with Jetty versions: 9.2.19.v20160908, 9.3.8.v20160314, 9.4.0.v20161208 Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/35c2a64b Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/35c2a64b Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/35c2a64b Branch: refs/heads/master Commit: 35c2a64b44944dd794da5fd3535cb48f3e742a47 Parents: 190c893 Author: Zoran Regvart <zo...@regvart.com> Authored: Fri Dec 16 15:36:02 2016 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Dec 16 22:07:03 2016 +0100 ---------------------------------------------------------------------- .../salesforce/SalesforceHttpClient.java | 34 ++++++++++++++++++-- .../client/SalesforceSecurityHandler.java | 5 +++ 2 files changed, 36 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/35c2a64b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceHttpClient.java ---------------------------------------------------------------------- diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceHttpClient.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceHttpClient.java index 6bca3f8..95095aa 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceHttpClient.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceHttpClient.java @@ -16,8 +16,11 @@ */ package org.apache.camel.component.salesforce; +import java.lang.reflect.Method; import java.net.URI; +import java.util.List; import java.util.concurrent.TimeUnit; +import static java.util.Optional.ofNullable; import org.apache.camel.component.salesforce.internal.SalesforceSession; import org.apache.camel.component.salesforce.internal.client.SalesforceHttpRequest; @@ -26,7 +29,9 @@ import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.HttpClientTransport; import org.eclipse.jetty.client.HttpConversation; import org.eclipse.jetty.client.HttpRequest; +import org.eclipse.jetty.client.ProtocolHandler; import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.client.http.HttpClientTransportOverHTTP; import org.eclipse.jetty.util.ssl.SslContextFactory; /** @@ -45,15 +50,34 @@ public class SalesforceHttpClient extends HttpClient { private int maxContentLength = DEFAULT_MAX_CONTENT_LENGTH; private long timeout = DEFAULT_TIMEOUT; + private final Method addSecuirtyHandlerMethod; + public SalesforceHttpClient() { + this(null); } public SalesforceHttpClient(SslContextFactory sslContextFactory) { - super(sslContextFactory); + this(null, sslContextFactory); } public SalesforceHttpClient(HttpClientTransport transport, SslContextFactory sslContextFactory) { - super(transport, sslContextFactory); + super(ofNullable(transport).orElse(new HttpClientTransportOverHTTP()), sslContextFactory); + + // Jetty 9.3, as opposed to 9.2 the way to add ProtocolHandler to + // HttpClient changed in 9.2 HttpClient::getProtocolHandlers returned + // List<ProtocolHandler, in 9.3 onward it returns ProtocolHandlers + // instance, this enables us to work with user supplied Jetty (>= 9.2) + try { + final Class<?> getProtocolHandlersType = HttpClient.class.getMethod("getProtocolHandlers").getReturnType(); + final boolean isJetty92 = List.class.equals(getProtocolHandlersType); + if (isJetty92) { + addSecuirtyHandlerMethod = List.class.getMethod("add", Object.class); + } else { + addSecuirtyHandlerMethod = getProtocolHandlersType.getMethod("put", ProtocolHandler.class); + } + } catch (NoSuchMethodException e) { + throw new IllegalStateException("Found no method of adding SalesforceSecurityHandler as ProtocolHandler to Jetty HttpClient. You need Jetty 9.2 or newer on the classpath."); + } } @Override @@ -73,7 +97,11 @@ public class SalesforceHttpClient extends HttpClient { if (getSession() == null) { throw new IllegalStateException("Missing SalesforceSession in property session!"); } - getProtocolHandlers().add(new SalesforceSecurityHandler(this)); + + // compensate for Jetty 9.2 vs 9.3 API change + final Object protocolHandlers = getProtocolHandlers(); + addSecuirtyHandlerMethod.invoke(protocolHandlers, new SalesforceSecurityHandler(this)); + super.doStart(); } http://git-wip-us.apache.org/repos/asf/camel/blob/35c2a64b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java ---------------------------------------------------------------------- diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java index fc11fe9..b9f1393 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java @@ -274,4 +274,9 @@ public class SalesforceSecurityHandler implements ProtocolHandler { response, responseFailure); } } + + // no @Override annotation here to keep it compatible with Jetty 9.2, getName was added in 9.3 + public String getName() { + return "CamelSalesforceSecurityHandler"; + } }