Repository: camel Updated Branches: refs/heads/master 6fae19134 -> ac8c494f9
CAMEL-7619: Rest DSL - adding support for xml/json binding using Camel's data formats. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c9463733 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c9463733 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c9463733 Branch: refs/heads/master Commit: c946373342634fac83810d8aae5ea228dd573dd1 Parents: 6fae191 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Aug 13 15:22:52 2014 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Aug 13 15:22:52 2014 +0200 ---------------------------------------------------------------------- .../processor/binding/RestBindingProcessor.java | 31 ++++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/c9463733/camel-core/src/main/java/org/apache/camel/processor/binding/RestBindingProcessor.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/processor/binding/RestBindingProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/binding/RestBindingProcessor.java index 7537a82..52ea190 100644 --- a/camel-core/src/main/java/org/apache/camel/processor/binding/RestBindingProcessor.java +++ b/camel-core/src/main/java/org/apache/camel/processor/binding/RestBindingProcessor.java @@ -44,6 +44,8 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess // TODO: consumes/produces can be a list of media types, and prioritized 1st to last. (eg the q=weight option) // TODO: use content-type from produces/consumes if possible to set as Content-Type if missing + // text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 + private final AsyncProcessor jsonUnmarshal; private final AsyncProcessor xmlUnmarshal; private final AsyncProcessor jsonMarshal; @@ -109,7 +111,8 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess boolean isXml = false; boolean isJson = false; - // content type takes precedence, over consumes + String accept = exchange.getIn().getHeader("Accept", String.class); + String contentType = ExchangeHelper.getContentType(exchange); if (contentType != null) { isXml = contentType.toLowerCase(Locale.US).contains("xml"); @@ -156,7 +159,7 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess if (isXml && xmlUnmarshal != null) { // add reverse operation - exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, true)); + exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, true, accept)); if (ObjectHelper.isNotEmpty(body)) { return xmlUnmarshal.process(exchange, callback); } else { @@ -165,7 +168,7 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess } } else if (isJson && jsonUnmarshal != null) { // add reverse operation - exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, false)); + exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, false, accept)); if (ObjectHelper.isNotEmpty(body)) { return jsonUnmarshal.process(exchange, callback); } else { @@ -177,7 +180,7 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess // we could not bind if (bindingMode.equals("auto")) { // okay for auto we do not mind if we could not bind - exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, false)); + exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, false, accept)); callback.done(true); return true; } else { @@ -216,12 +219,14 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess private final AsyncProcessor xmlMarshal; private final String routeId; private boolean wasXml; + private String accept; - private RestBindingMarshalOnCompletion(String routeId, AsyncProcessor jsonMarshal, AsyncProcessor xmlMarshal, boolean wasXml) { + private RestBindingMarshalOnCompletion(String routeId, AsyncProcessor jsonMarshal, AsyncProcessor xmlMarshal, boolean wasXml, String accept) { this.routeId = routeId; this.jsonMarshal = jsonMarshal; this.xmlMarshal = xmlMarshal; this.wasXml = wasXml; + this.accept = accept; } @Override @@ -257,10 +262,18 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess boolean isXml = false; boolean isJson = false; - String contentType = ExchangeHelper.getContentType(exchange); - if (contentType != null) { - isXml = contentType.toLowerCase(Locale.US).contains("xml"); - isJson = contentType.toLowerCase(Locale.US).contains("json"); + // accept takes precedence + if (accept != null) { + isXml = accept.toLowerCase(Locale.US).contains("xml"); + isJson = accept.toLowerCase(Locale.US).contains("json"); + } + // fallback to content type if still undecided + if (!isXml && !isJson) { + String contentType = ExchangeHelper.getContentType(exchange); + if (contentType != null) { + isXml = contentType.toLowerCase(Locale.US).contains("xml"); + isJson = contentType.toLowerCase(Locale.US).contains("json"); + } } // if content type could not tell us if it was json or xml, then fallback to if the binding was configured with // that information in the consumes