[1/2] git commit: CAMEL-7619: Rest DSL - adding support for xml/json binding using Camel's data formats.

2014-08-13 Thread davsclaus
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 
Authored: Wed Aug 13 15:22:52 2014 +0200
Committer: Claus Ibsen 
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;
  

[1/2] git commit: CAMEL-7619: Rest DSL - adding support for xml/json binding using Camel's data formats. Work in progress.

2014-07-23 Thread davsclaus
Repository: camel
Updated Branches:
  refs/heads/master 68793857c -> 966846055


CAMEL-7619: Rest DSL - adding support for xml/json binding using Camel's data 
formats. Work in progress.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/96684605
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/96684605
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/96684605

Branch: refs/heads/master
Commit: 966846055e335431a378502ad4878d20a38b5b12
Parents: 4669b17
Author: Claus Ibsen 
Authored: Wed Jul 23 17:08:07 2014 +0200
Committer: Claus Ibsen 
Committed: Wed Jul 23 17:37:59 2014 +0200

--
 .../camel/model/rest/RestBindingDefinition.java | 72 +--
 .../camel/model/rest/RestBindingMode.java   | 28 ++
 .../model/rest/RestConfigurationDefinition.java | 22 +
 .../apache/camel/model/rest/RestDefinition.java | 14 +++
 .../apache/camel/model/rest/VerbDefinition.java | 11 +++
 .../processor/binding/RestBindingProcessor.java | 94 
 .../org/apache/camel/spi/RestConfiguration.java | 34 ++-
 .../org/apache/camel/model/rest/jaxb.index  |  1 +
 .../restlet/RestRestletBindingModeJsonTest.java | 61 +
 .../restlet/RestRestletBindingModeXmlTest.java  | 61 +
 10 files changed, 376 insertions(+), 22 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/camel/blob/96684605/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
--
diff --git 
a/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
 
b/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
index 045c7e7..229cf6f 100644
--- 
a/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
+++ 
b/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
@@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlTransient;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.model.NoOutputDefinition;
+import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.processor.binding.RestBindingProcessor;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.RouteContext;
@@ -37,6 +38,15 @@ import org.apache.camel.util.ObjectHelper;
 public class RestBindingDefinition extends NoOutputDefinition {
 
 @XmlAttribute
+private String consumes;
+
+@XmlAttribute
+private String produces;
+
+@XmlAttribute
+private RestBindingMode bindingMode;
+
+@XmlAttribute
 private String jsonDataFormat;
 
 @XmlAttribute
@@ -75,14 +85,24 @@ public class RestBindingDefinition extends 
NoOutputDefinition {
 
 CamelContext context = routeContext.getCamelContext();
 
+// the default binding mode can be overriden per rest verb
+String mode = context.getRestConfiguration().getBindingMode().name();
+if (bindingMode != null) {
+mode = bindingMode.name();
+}
+
+// auto, off, json, xml, json_xml
+
 // setup json data format
 String name = jsonDataFormat;
 if (name == null) {
 name = "json-jackson";
 }
 DataFormat json = context.resolveDataFormat(name);
-if (json == null) {
-throw new IllegalArgumentException("DataFormat " + name + " not 
found.");
+
+// is json binding required?
+if (mode.contains("json") && json == null) {
+throw new IllegalArgumentException("JSon DataFormat " + name + " 
not found.");
 }
 if (classType == null && type != null) {
 classType = context.getClassResolver().resolveMandatoryClass(type);
@@ -102,8 +122,9 @@ public class RestBindingDefinition extends 
NoOutputDefinition {
 name = "jaxb";
 }
 DataFormat jaxb = context.resolveDataFormat(name);
-if (jaxb == null) {
-throw new IllegalArgumentException("DataFormat " + name + " not 
found.");
+// is xml binding required?
+if (mode.contains("xml") && jaxb == null) {
+throw new IllegalArgumentException("XML DataFormat " + name + " 
not found.");
 }
 if (classType == null && type != null) {
 classType = context.getClassResolver().resolveMandatoryClass(type);
@@ -117,7 +138,47 @@ public class RestBindingDefinition extends 
NoOutputDefinition {
 }
 context.addService(jaxb);
 
-return new RestBindingProcessor(json, jaxb);
+return new RestBindingProcessor(json, jaxb, consumes, produces, mode);
+}
+
+public String getConsumes() {
+return consumes;
+}
+
+public void setConsumes(String consumes) {
+this.consumes = consume