You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2014/08/13 15:43:51 UTC
[1/2] git commit: CAMEL-7619: Rest DSL - adding support for xml/json
binding using Camel's data formats.
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 <da...@apache.org>
Authored: Wed Aug 13 15:22:52 2014 +0200
Committer: Claus Ibsen <da...@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
[2/2] git commit: CAMEL-7619: Rest DSL - adding support for xml/json
binding using Camel's data formats.
Posted by da...@apache.org.
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/ac8c494f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ac8c494f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ac8c494f
Branch: refs/heads/master
Commit: ac8c494f9f52858a45311334e5c1f04e063d4827
Parents: c946373
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Aug 13 15:35:10 2014 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Aug 13 15:35:10 2014 +0200
----------------------------------------------------------------------
.../processor/binding/RestBindingProcessor.java | 30 +++++++++++---------
1 file changed, 16 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/ac8c494f/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 52ea190..ec1af34 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
@@ -157,20 +157,21 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess
}
}
- if (isXml && xmlUnmarshal != null) {
+ // favor json over xml
+ if (isJson && jsonUnmarshal != null) {
// add reverse operation
- exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, true, accept));
+ exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, false, accept));
if (ObjectHelper.isNotEmpty(body)) {
- return xmlUnmarshal.process(exchange, callback);
+ return jsonUnmarshal.process(exchange, callback);
} else {
callback.done(true);
return true;
}
- } else if (isJson && jsonUnmarshal != null) {
+ } else if (isXml && xmlUnmarshal != null) {
// add reverse operation
- exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, false, accept));
+ exchange.addOnCompletion(new RestBindingMarshalOnCompletion(exchange.getFromRouteId(), jsonMarshal, xmlMarshal, true, accept));
if (ObjectHelper.isNotEmpty(body)) {
- return jsonUnmarshal.process(exchange, callback);
+ return xmlUnmarshal.process(exchange, callback);
} else {
callback.done(true);
return true;
@@ -302,20 +303,21 @@ public class RestBindingProcessor extends ServiceSupport implements AsyncProcess
ExchangeHelper.prepareOutToIn(exchange);
try {
- if (isXml && xmlMarshal != null) {
- // make sure there is a content-type with xml
- String type = ExchangeHelper.getContentType(exchange);
- if (type == null) {
- exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/xml");
- }
- xmlMarshal.process(exchange);
- } else if (isJson && jsonMarshal != null) {
+ // favor json over xml
+ if (isJson && jsonMarshal != null) {
// make sure there is a content-type with json
String type = ExchangeHelper.getContentType(exchange);
if (type == null) {
exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json");
}
jsonMarshal.process(exchange);
+ } else if (isXml && xmlMarshal != null) {
+ // make sure there is a content-type with xml
+ String type = ExchangeHelper.getContentType(exchange);
+ if (type == null) {
+ exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/xml");
+ }
+ xmlMarshal.process(exchange);
} else {
// we could not bind
if (bindingMode.equals("auto")) {