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")) {