This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 9d2041992 CAMEL-17046 Implemented DatasonnetBuilder (#6220)
9d2041992 is described below

commit 9d20419923f3191a2c75092ae7b8f30e49019b50
Author: henka-rl <67908385+henka...@users.noreply.github.com>
AuthorDate: Thu Oct 7 07:14:26 2021 +0200

    CAMEL-17046 Implemented DatasonnetBuilder (#6220)
---
 .../datasonnet/CamelDatasonnetJavaDslTest.java     | 111 +++++++++++++++
 .../org/apache/camel/builder/BuilderSupport.java   |  12 +-
 .../apache/camel/builder/DatasonnetBuilder.java    | 149 +++++++++++++++++++++
 3 files changed, 264 insertions(+), 8 deletions(-)

diff --git 
a/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetJavaDslTest.java
 
b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetJavaDslTest.java
new file mode 100644
index 0000000..6f6a768
--- /dev/null
+++ 
b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/CamelDatasonnetJavaDslTest.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.language.datasonnet;
+
+import java.io.InputStream;
+import java.nio.charset.Charset;
+
+import com.datasonnet.document.Document;
+import com.datasonnet.document.MediaTypes;
+import org.apache.camel.Exchange;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.support.ExchangeHelper;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.apache.commons.io.IOUtils;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+public class CamelDatasonnetJavaDslTest extends CamelTestSupport {
+    private MockEndpoint mock;
+
+    @Test
+    public void testTransform() throws Exception {
+        runCamelTest(loadResourceAsString("simpleMapping_payload.json"),
+                loadResourceAsString("simpleMapping_result.json"),
+                "direct:basicTransform");
+    }
+
+    @Test
+    public void testTransformXML() throws Exception {
+        runCamelTest(loadResourceAsString("payload.xml"),
+                loadResourceAsString("readXMLExtTest.json"),
+                "direct:transformXML");
+    }
+
+    @Test
+    public void testTransformCSV() throws Exception {
+        runCamelTest(loadResourceAsString("payload.csv"),
+                "{\"account\":\"123\"}",
+                "direct:transformCSV");
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:basicTransform")
+                        .routeId("basicTransform")
+                        .setProperty("test", constant("HelloWorld"))
+                        .setProperty("count", 
simple("1").resultType(Integer.class))
+                        .setProperty("isActive", 
simple("true").resultType(Boolean.class))
+                        .setProperty("1. Full Name", constant("DataSonnet"))
+                        
.transform(datasonnet("resource:classpath:simpleMapping.ds", String.class)
+                                
.bodyMediaType(MediaTypes.APPLICATION_JSON_VALUE)
+                                
.outputMediaType(MediaTypes.APPLICATION_JSON_VALUE))
+                        .to("mock:direct:end");
+
+                from("direct:transformXML")
+                        .routeId("transformXML")
+                        
.transform(datasonnet("resource:classpath:readXMLExtTest.ds", String.class)
+                                
.bodyMediaType(MediaTypes.APPLICATION_XML_VALUE)
+                                
.outputMediaType(MediaTypes.APPLICATION_JSON_VALUE))
+                        .to("mock:direct:end");
+
+                from("direct:transformCSV")
+                        .routeId("transformCSV")
+                        
.transform(datasonnet("resource:classpath:readCSVTest.ds", String.class)
+                                
.bodyMediaType(MediaTypes.APPLICATION_CSV_VALUE)
+                                
.outputMediaType(MediaTypes.APPLICATION_JSON_VALUE))
+                        .to("mock:direct:end");
+
+            }
+        };
+    }
+
+    private void runCamelTest(Object payload, String expectedJson, String uri) 
throws Exception {
+        template.sendBody(uri, payload);
+        mock = getMockEndpoint("mock:direct:end");
+        Exchange exchange = 
mock.assertExchangeReceived(mock.getReceivedCounter() - 1);
+        Object body = exchange.getMessage().getBody();
+        String response;
+        if (body instanceof Document) {
+            response = ExchangeHelper.convertToMandatoryType(exchange, 
String.class, ((Document<?>) body).getContent());
+        } else {
+            response = exchange.getMessage().getBody(String.class);
+
+        }
+        JSONAssert.assertEquals(expectedJson, response, true);
+    }
+
+    private String loadResourceAsString(String name) throws Exception {
+        InputStream is = getClass().getClassLoader().getResourceAsStream(name);
+        return IOUtils.toString(is, Charset.defaultCharset());
+    }
+}
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
index a75da04..97ea58d 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
@@ -26,7 +26,6 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Expression;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.model.language.DatasonnetExpression;
 import org.apache.camel.model.language.ExchangePropertyExpression;
 import org.apache.camel.model.language.HeaderExpression;
 import org.apache.camel.model.language.XPathExpression;
@@ -164,18 +163,15 @@ public abstract class BuilderSupport implements 
CamelContextAware {
     /**
      * Returns a Datasonnet expression value builder
      */
-    public ValueBuilder datasonnet(String value) {
-        DatasonnetExpression exp = new DatasonnetExpression(value);
-        return new ValueBuilder(exp);
+    public DatasonnetBuilder datasonnet(String value) {
+        return DatasonnetBuilder.datasonnet(value);
     }
 
     /**
      * Returns a Datasonnet expression value builder
      */
-    public ValueBuilder datasonnet(String value, Class<?> resultType) {
-        DatasonnetExpression exp = new DatasonnetExpression(value);
-        exp.setResultType(resultType);
-        return new ValueBuilder(exp);
+    public DatasonnetBuilder datasonnet(String value, Class<?> resultType) {
+        return DatasonnetBuilder.datasonnet(value, resultType);
     }
 
     /**
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/builder/DatasonnetBuilder.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/builder/DatasonnetBuilder.java
new file mode 100644
index 0000000..4d08264
--- /dev/null
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/builder/DatasonnetBuilder.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.spi.ExpressionResultTypeAware;
+import org.apache.camel.spi.Language;
+
+/**
+ * Creates an Simple language builder.
+ * <p/>
+ * This builder is available in the Java DSL from the {@link RouteBuilder} 
which means that using simple language for
+ * {@link Expression}s or {@link Predicate}s is very easy with the help of 
this builder.
+ */
+public class DatasonnetBuilder implements Predicate, Expression, 
ExpressionResultTypeAware {
+
+    private String text;
+    private Class<?> resultType;
+    private String bodyMediaType;
+    private String outputMediaType;
+
+    // cache the expression/predicate
+    private Language datasonnet;
+    private volatile Expression expression;
+    private volatile Predicate predicate;
+
+    public DatasonnetBuilder(String text) {
+        this.text = text;
+    }
+
+    public static DatasonnetBuilder datasonnet(String text) {
+        return new DatasonnetBuilder(text);
+    }
+
+    public static DatasonnetBuilder datasonnet(String text, Class<?> 
resultType) {
+        DatasonnetBuilder answer = datasonnet(text);
+        answer.setResultType(resultType);
+        return answer;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    @Override
+    public String getExpressionText() {
+        return getText();
+    }
+
+    @Override
+    public Class<?> getResultType() {
+        return resultType;
+    }
+
+    public void setResultType(Class<?> resultType) {
+        this.resultType = resultType;
+    }
+
+    public String getBodyMediaType() {
+        return bodyMediaType;
+    }
+
+    public void setBodyMediaType(String bodyMediaType) {
+        this.bodyMediaType = bodyMediaType;
+    }
+
+    public String getOutputMediaType() {
+        return outputMediaType;
+    }
+
+    public void setOutputMediaType(String outputMediaType) {
+        this.outputMediaType = outputMediaType;
+    }
+
+    public DatasonnetBuilder resultType(Class<?> resultType) {
+        setResultType(resultType);
+        return this;
+    }
+
+    public DatasonnetBuilder bodyMediaType(String bodyMediaType) {
+        setBodyMediaType(bodyMediaType);
+        return this;
+    }
+
+    public DatasonnetBuilder outputMediaType(String outputMediaType) {
+        setOutputMediaType(outputMediaType);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return text;
+    }
+
+    @Override
+    public <T> T evaluate(Exchange exchange, Class<T> type) {
+        if (expression == null) {
+            if (datasonnet == null) {
+                init(exchange.getContext());
+            }
+            if (resultType != null) {
+                Object[] properties = new Object[3];
+                properties[0] = resultType;
+                properties[1] = bodyMediaType;
+                properties[2] = outputMediaType;
+                expression = datasonnet.createExpression(text, properties);
+            } else {
+                expression = datasonnet.createExpression(text);
+            }
+            expression.init(exchange.getContext());
+        }
+        return expression.evaluate(exchange, type);
+    }
+
+    @Override
+    public boolean matches(Exchange exchange) {
+        if (predicate == null) {
+            if (datasonnet == null) {
+                init(exchange.getContext());
+            }
+            predicate = datasonnet.createPredicate(text);
+            predicate.init(exchange.getContext());
+        }
+        return predicate.matches(exchange);
+    }
+
+    @Override
+    public void init(CamelContext context) {
+        datasonnet = context.resolveLanguage("datasonnet");
+        text = context.resolvePropertyPlaceholders(text);
+    }
+}

Reply via email to