diff --git a/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java b/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java index ec3c82aff13a7..fc51d36b2c15c 100644 --- a/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java +++ b/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java @@ -17,14 +17,9 @@ package org.apache.camel.component.jolt; import java.io.InputStream; +import java.util.Map; -import com.bazaarvoice.jolt.Chainr; -import com.bazaarvoice.jolt.Defaultr; -import com.bazaarvoice.jolt.JsonUtils; -import com.bazaarvoice.jolt.Removr; -import com.bazaarvoice.jolt.Shiftr; -import com.bazaarvoice.jolt.Sortr; -import com.bazaarvoice.jolt.Transform; +import com.bazaarvoice.jolt.*; import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; @@ -32,6 +27,7 @@ import org.apache.camel.component.ResourceEndpoint; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; +import org.apache.camel.util.ExchangeHelper; import org.apache.camel.util.ObjectHelper; /** @@ -40,8 +36,8 @@ @UriEndpoint(firstVersion = "2.16.0", scheme = "jolt", title = "JOLT", syntax = "jolt:resourceUri", producerOnly = true, label = "transformation") public class JoltEndpoint extends ResourceEndpoint { - private Transform transform; - + private JoltTransform transform; + @UriParam(defaultValue = "Hydrated") private JoltInputOutputType outputType; @@ -73,7 +69,7 @@ protected String createEndpointUri() { return "jolt:" + getResourceUri(); } - private synchronized Transform getTransform() throws Exception { + private synchronized JoltTransform getTransform() throws Exception { if (transform == null) { if (log.isDebugEnabled()) { String path = getResourceUri(); @@ -110,7 +106,7 @@ private synchronized Transform getTransform() throws Exception { /** * Sets the Transform to use. If not set a Transform specified by the transformDsl will be created */ - public void setTransform(Transform transform) { + public void setTransform(JoltTransform transform) { this.transform = transform; } @@ -167,14 +163,24 @@ protected void onExchange(Exchange exchange) throws Exception { newEndpoint.onExchange(exchange); return; } + Object input; if (getInputType() == JoltInputOutputType.JsonString) { input = JsonUtils.jsonToObject(exchange.getIn().getBody(InputStream.class)); } else { input = exchange.getIn().getBody(); } - Object output = getTransform().transform(input); - + + Object output; + + @SuppressWarnings("unchecked") + Map inputContextMap = exchange.getIn().getHeader(JoltConstants.JOLT_CONTEXT, Map.class); + if (inputContextMap != null) { + output = ((ContextualTransform)getTransform()).transform(input, inputContextMap); + } else { + output = ((Transform)getTransform()).transform(input); + } + // now lets output the results to the exchange Message out = exchange.getOut(); if (getOutputType() == JoltInputOutputType.JsonString) { diff --git a/components/camel-jolt/src/test/java/org/apache/camel/component/jolt/JoltFirstSampleTest.java b/components/camel-jolt/src/test/java/org/apache/camel/component/jolt/JoltFirstSampleTest.java index a70cc5bf24de2..63bef43ed5b3b 100644 --- a/components/camel-jolt/src/test/java/org/apache/camel/component/jolt/JoltFirstSampleTest.java +++ b/components/camel-jolt/src/test/java/org/apache/camel/component/jolt/JoltFirstSampleTest.java @@ -16,12 +16,17 @@ */ package org.apache.camel.component.jolt; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.test.junit4.CamelTestSupport; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ResourceHelper; import org.junit.Test; +import java.util.HashMap; +import java.util.Map; + /** * Unit test based on the first sample test from the JOLT project. */ @@ -46,9 +51,19 @@ public void testFirstSampleJolt() throws Exception { @Override protected RouteBuilder createRouteBuilder() throws Exception { + final Processor processor = new Processor() { + public void process(Exchange exchange) { + Map contextMap = new HashMap<>(); + contextMap.put("contextB", "bb"); + + exchange.getIn().setHeader(JoltConstants.JOLT_CONTEXT, contextMap); + } + }; + return new RouteBuilder() { public void configure() { from("direct://start") + .process(processor) .to("jolt:org/apache/camel/component/jolt/firstSample/spec.json?inputType=JsonString&outputType=JsonString") .to("mock:result"); } diff --git a/components/camel-jolt/src/test/resources/org/apache/camel/component/jolt/firstSample/output.json b/components/camel-jolt/src/test/resources/org/apache/camel/component/jolt/firstSample/output.json index 093bb818e8cac..7b7e8fc6f45c7 100644 --- a/components/camel-jolt/src/test/resources/org/apache/camel/component/jolt/firstSample/output.json +++ b/components/camel-jolt/src/test/resources/org/apache/camel/component/jolt/firstSample/output.json @@ -1 +1 @@ -{"~a":"aa","~id":"id","~z":"zz","Rating":3,"RatingRange":5,"SecondaryRatings":{"quality":{"Id":"quality","Range":7,"Value":3},"sharpness":{"Id":"sharpness","Range":5,"Value":5}},"zz":"zz"} \ No newline at end of file +{"~a":"aa","~id":"id","~z":"zz","Rating":3,"RatingRange":5,"SecondaryRatings":{"quality":{"Id":"quality","Range":7,"Value":3},"sharpness":{"Id":"sharpness","Range":5,"Value":5}},"b":"bb","zz":"zz"} \ No newline at end of file diff --git a/components/camel-jolt/src/test/resources/org/apache/camel/component/jolt/firstSample/spec.json b/components/camel-jolt/src/test/resources/org/apache/camel/component/jolt/firstSample/spec.json index d5b39b655d1e0..eed7bee352be5 100644 --- a/components/camel-jolt/src/test/resources/org/apache/camel/component/jolt/firstSample/spec.json +++ b/components/camel-jolt/src/test/resources/org/apache/camel/component/jolt/firstSample/spec.json @@ -34,6 +34,12 @@ "~deleteme": "" } }, + { + "operation": "modify-overwrite-beta", + "spec": { + "b": "^contextB" + } + }, { // last operation is to sort the JSON "operation": "sort"