Repository: camel Updated Branches: refs/heads/master 45fd4196f -> 4da8d0ad4
CAMEL-11276: camel-restlet should use {} placeholders instead of () so its similar to all the other REST components. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/4da8d0ad Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/4da8d0ad Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/4da8d0ad Branch: refs/heads/master Commit: 4da8d0ad4472e69a5728f67fa121b3b4150fdc33 Parents: 45fd419 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed May 24 14:11:10 2017 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed May 24 14:11:44 2017 +0200 ---------------------------------------------------------------------- .../restlet/DefaultRestletBinding.java | 28 +++++++++++++++++--- .../component/restlet/RestletComponent.java | 7 +++++ .../component/restlet/RestletEndpoint.java | 17 ++++++++++++ .../component/restlet/RestletProducer.java | 10 +++++-- .../RestletHttpEmptyQueryParameterTest.java | 2 -- 5 files changed, 56 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/4da8d0ad/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java index c4f62b1..0d8d0e2 100644 --- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java +++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java @@ -27,12 +27,14 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; +import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import javax.servlet.http.HttpServletRequest; import javax.xml.transform.dom.DOMSource; import org.apache.camel.Exchange; @@ -42,11 +44,14 @@ import org.apache.camel.StringSource; import org.apache.camel.TypeConverter; import org.apache.camel.WrappedFile; import org.apache.camel.component.file.GenericFile; +import org.apache.camel.http.common.HttpHelper; +import org.apache.camel.http.common.HttpMessage; import org.apache.camel.spi.HeaderFilterStrategy; import org.apache.camel.spi.HeaderFilterStrategyAware; import org.apache.camel.util.IOHelper; import org.apache.camel.util.MessageHelper; import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.URISupport; import org.apache.http.NameValuePair; import org.apache.http.client.utils.URLEncodedUtils; import org.restlet.Request; @@ -112,10 +117,7 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate // copy query string to header - String query = request.getResourceRef().getQuery(); - if (query != null) { - inMessage.setHeader(Exchange.HTTP_QUERY, query); - } + populateQueryParameters(request, exchange); // copy URI to header inMessage.setHeader(Exchange.HTTP_URI, request.getResourceRef().getIdentifier(true)); @@ -158,6 +160,24 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate } + protected void populateQueryParameters(Request request, Exchange exchange) throws Exception { + String query = request.getResourceRef().getQuery(); + if (query != null) { + exchange.getIn().setHeader(Exchange.HTTP_QUERY, query); + + // parse query and map to Camel message headers + Map<String, Object> map = URISupport.parseQuery(query); + for (Map.Entry<String, Object> entry : map.entrySet()) { + if (!headerFilterStrategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), exchange)) { + String key = entry.getKey(); + Object value = entry.getValue(); + LOG.trace("HTTP query parameter {} = {}", key, value); + exchange.getIn().setHeader(key, value); + } + } + } + } + public void populateRestletRequestFromExchange(Request request, Exchange exchange) { request.setReferrerRef("camel-restlet"); http://git-wip-us.apache.org/repos/asf/camel/blob/4da8d0ad/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java index e40eef1..e2f1b71 100644 --- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java +++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java @@ -198,6 +198,13 @@ public class RestletComponent extends HeaderFilterStrategyComponent implements R result.setSslContextParameters(retrieveGlobalSslContextParameters()); } + // any additional query parameters from parameters then we need to include them as well + if (!parameters.isEmpty()) { + result.setQueryParameters(parameters); + endpointUri = URISupport.appendParametersToURI(endpointUri, parameters); + result.setCompleteEndpointUri(endpointUri); + } + return result; } http://git-wip-us.apache.org/repos/asf/camel/blob/4da8d0ad/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java index fb8a3a5..d6e34f7 100644 --- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java +++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletEndpoint.java @@ -87,11 +87,17 @@ public class RestletEndpoint extends DefaultEndpoint implements AsyncEndpoint, H private boolean autoCloseStream; @UriParam(label = "producer") private CookieHandler cookieHandler; + // should NOT be exposes as @UriParam + private transient Map<String, Object> queryParameters; public RestletEndpoint(RestletComponent component, String remaining) throws Exception { super(remaining, component); } + public void setCompleteEndpointUri(String uri) { + setEndpointUri(uri); + } + public boolean isSingleton() { return true; } @@ -357,6 +363,17 @@ public class RestletEndpoint extends DefaultEndpoint implements AsyncEndpoint, H this.cookieHandler = cookieHandler; } + public Map<String, Object> getQueryParameters() { + return queryParameters; + } + + /** + * Additional query parameters for producer + */ + public void setQueryParameters(Map<String, Object> queryParameters) { + this.queryParameters = queryParameters; + } + @Override protected void doStart() throws Exception { if (headerFilterStrategy == null) { http://git-wip-us.apache.org/repos/asf/camel/blob/4da8d0ad/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java index d0261a5..7efd629 100644 --- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java +++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java @@ -17,9 +17,11 @@ package org.apache.camel.component.restlet; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.CookieStore; import java.net.HttpCookie; import java.net.URI; +import java.net.URISyntaxException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -204,16 +206,20 @@ public class RestletProducer extends DefaultAsyncProducer { return false; } - private static String buildUri(RestletEndpoint endpoint, Exchange exchange) throws CamelExchangeException { + private static String buildUri(RestletEndpoint endpoint, Exchange exchange) throws Exception { // rest producer may provide an override url to be used which we should discard if using (hence the remove) String uri = (String) exchange.getIn().removeHeader(Exchange.REST_HTTP_URI); if (uri == null) { uri = endpoint.getProtocol() + "://" + endpoint.getHost() + ":" + endpoint.getPort() + endpoint.getUriPattern(); } + // include any query parameters if needed + if (endpoint.getQueryParameters() != null) { + uri = URISupport.appendParametersToURI(uri, endpoint.getQueryParameters()); + } // substitute { } placeholders in uri and use mandatory headers - LOG.trace("Substituting '(value)' placeholders in uri: {}", uri); + LOG.trace("Substituting '{value}' placeholders in uri: {}", uri); Matcher matcher = PATTERN.matcher(uri); while (matcher.find()) { String key = matcher.group(1); http://git-wip-us.apache.org/repos/asf/camel/blob/4da8d0ad/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletHttpEmptyQueryParameterTest.java ---------------------------------------------------------------------- diff --git a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletHttpEmptyQueryParameterTest.java b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletHttpEmptyQueryParameterTest.java index 5b16e07..c756147 100644 --- a/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletHttpEmptyQueryParameterTest.java +++ b/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletHttpEmptyQueryParameterTest.java @@ -17,13 +17,11 @@ package org.apache.camel.component.restlet; import org.apache.camel.builder.RouteBuilder; -import org.junit.Ignore; import org.junit.Test; /** * @version */ -@Ignore("Need to add support for lenient properties to producer") public class RestletHttpEmptyQueryParameterTest extends RestletTestSupport { @Test