[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 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.
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